Python 特金特圭元';t Start-Thread-Tkinter对象没有属性';标签';
我有一个Tkinter GUI,它是从我的另一个文件复制粘贴的 两个GUI是完全相同的副本,1:1。第一个有效,第二个无效 这是第二个文件,带有TKinter GUI:Python 特金特圭元';t Start-Thread-Tkinter对象没有属性';标签';,python,class,object,tkinter,python-multithreading,Python,Class,Object,Tkinter,Python Multithreading,我有一个Tkinter GUI,它是从我的另一个文件复制粘贴的 两个GUI是完全相同的副本,1:1。第一个有效,第二个无效 这是第二个文件,带有TKinter GUI: import mysql.connector import threading import tkinter as tk import pip import time import mysql.connector from time import sleep global score global countdown en
import mysql.connector
import threading
import tkinter as tk
import pip
import time
import mysql.connector
from time import sleep
global score
global countdown
en = "1"
score = 0
countdown = 1
tidMål = 0
tidScoreNu = 0
print("Hiya!")
mydb = mysql.connector.connect(
host="",
user="",
password="",
database='',
auth_plugin=''
)
mycursor = mydb.cursor(prepared=True)
#MysQl commands til at interface det hele
class Mysql(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.daemon = True
self.en = 1
self.læsTidScoreNu = "SELECT tidSCoreNu FROM bois WHERE id = 1"
self.læsTidMål = "SELECT tidMål FROM bois WHERE id = 1"
self.opdaterTidMål = "UPDATE bois SET tidMål = %s WHERE id = %s"
self.læsStopKnap = "SELECT stopKnap FROM bois WHERE id = 1"
self.run()
def run(self) -> None:
global mycursor
global mydb
mycursor.execute(self.læsTidScoreNu)
self.råTidScoreNu = mycursor.fetchone()
self.tidScoreNu = float("{}".format('%.2f' % self.råTidScoreNu))
mycursor.execute(self.læsTidMål)
self.råTidMål = mycursor.fetchone()
self.tidMål = float("{}".format('%.2f' % self.råTidMål))
mycursor.execute(self.læsStopKnap)
self.stopKnap = mycursor.fetchone()
mydb.commit()
#Control GUI til admin portalen
class Tkinter(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.daemon = True
self.root = 0
self.entry = 0
self.label = 0
self.button = 0
self.timerValue = 2
self.stopButton = 0
self.start()
self.spilSlut = 0
def run(self) -> 0:
self.root = tk.Tk()
global countdown
#Baggrund
self.root.geometry("+2+0")
self.root.config(background="Grey")
#Timervalue selectors
self.label = tk.Label(self.root, bg="white", fg="black", font=("Fixedsys", 28))
self.entry = tk.Entry(self.root, bg="white", fg="black", font=("Fixedsys", 28))
#Start/Stop Knapper
self.stopTiden = tk.Button(self.root, bg="red", fg="white", text="Stop Spillet", command=self.stopTid)
self.startTiden = tk.Button(self.root, bg="green", fg="white", text="Start Spillet", command=self.startTid)
#Timeren
self.timerDisplay = tk.Label(self.root, bg="black", fg="red", text="Spillet er ikke startet")
self.timerDisplay.grid(row=2, column=50)
self.startTiden.grid(row=0, column=1)
self.stopTiden.grid(row=0, column=10)
self.entry.grid(row=1, column=1)
self.label.grid(row=1, column=10)
self.root.bind("<KeyPress>", self.read)
self.Update(self)
self.root.mainloop()
def read(self, event):
key = event.keysym
try:
if key == "Return":
self.getA()
self.visTid()
except:
self.fejlTidvalg()
def startTid(self):
self.stopButton = 0
def getA(self):
try:
self.timerValue = float(self.entry.get().format("%.2f", 1.23456))
print(self.timerValue)
return self.timerValue
except:
print(fejl)
def stopTid(self):
self.stopButton = 1
print("Spillet er stoppet nu")
def visTid(self):
self.label.config(text="Det her er timerens slutværdi: {}".format(self.timerValue))
def fejlTidvalg(self):
self.label.config(text="FEJL -Vælg Venligst Et Tal")
def opdaterCountdown(self):
if self.stopButton != 1:
self.spilSlut = 0
self.tidTilbage = self.timerValue - countdown
self.tidTilbage_minutter = int(self.tidTilbage/60)
self.tidTilbage_sekunder = (self.tidTilbage) - (self.tidTilbage_minutter * 60)
self.timerDisplay.config(text="{} minutter, {:.2f} sekunder tilbage".format(self.tidTilbage_minutter, self.tidTilbage_sekunder))
if self.tidTilbage < 0 or self.tidTilbage == 0 and self.timerValue > 0:
self.spilSlut = 1
elif self.stopButton == 1:
self.timerDisplay.config(text="Spillet er sat på pause")
def opdaterCountdownSpilSlut(self):
self.timerDisplay.config(text="Spillet er slut")
class Update(threading.Thread):
def __init__(self, tkinter):
threading.Thread.__init__(self)
self.daemon = True
self.tkinter = tkinter
self.start()
def run(self) -> None:
while True:
time.sleep(0.1)
self.tkinter.opdaterCountdown()
if self.tkinter.spilSlut == 1:
self.tkinter.opdaterCountdownSpilSlut()
time.sleep(1)
tk = Tkinter()
data = Mysql()
while True:
print()
我一直在论坛上寻找解决方案,结果通常是在定义函数/变量之前运行函数/变量。问题是,我在运行它之前已经定义了它,并且,完全相同的代码在我的第一个程序中运行得非常好
我的第一个程序的GUI:
import threading
import tkinter as tk
import pip
import time
import mysql.connector
from time import sleep
global score
global countdown
en = "1"
score = 0
countdown = 1
print("Hiya!")
class Tkinter(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.daemon = True
self.root = 0
self.entry = 0
self.label = 0
self.button = 0
self.timerValue = 2
self.stopButton = 0
self.start()
self.spilSlut = 0
def run(self) -> 0:
self.root = tk.Tk()
global countdown
#Baggrund
self.root.geometry("+2+0")
self.root.config(background="Grey")
#Timervalue selectors
self.label = tk.Label(self.root, bg="white", fg="black", font=("Fixedsys", 28))
self.entry = tk.Entry(self.root, bg="white", fg="black", font=("Fixedsys", 28))
#Start/Stop Knapper
self.stopTiden = tk.Button(self.root, bg="red", fg="white", text="Stop Spillet", command=self.stopTid)
self.startTiden = tk.Button(self.root, bg="green", fg="white", text="Start Spillet", command=self.startTid)
#Timeren
self.timerDisplay = tk.Label(self.root, bg="black", fg="red", text="Spillet er ikke startet")
self.timerDisplay.grid(row=2, column=50)
self.startTiden.grid(row=0, column=1)
self.stopTiden.grid(row=0, column=10)
self.entry.grid(row=1, column=1)
self.label.grid(row=1, column=10)
self.root.bind("<KeyPress>", self.read)
self.Update(self)
self.root.mainloop()
def read(self, event):
key = event.keysym
try:
if key == "Return":
self.getA()
self.visTid()
except:
self.fejlTidvalg()
def startTid(self):
self.stopButton = 0
def getA(self):
try:
self.timerValue = float(self.entry.get().format("%.2f", 1.23456))
print(self.timerValue)
return self.timerValue
except:
print(fejl)
def stopTid(self):
self.stopButton = 1
print("Spillet er stoppet nu")
def visTid(self):
self.label.config(text="Det her er timerens slutværdi: {}".format(self.timerValue))
def fejlTidvalg(self):
self.label.config(text="FEJL -Vælg Venligst Et Tal")
def opdaterCountdown(self):
if self.stopButton != 1:
self.spilSlut = 0
self.tidTilbage = self.timerValue - countdown
self.tidTilbage_minutter = int(self.tidTilbage/60)
self.tidTilbage_sekunder = (self.tidTilbage) - (self.tidTilbage_minutter * 60)
self.timerDisplay.config(text="{} minutter, {:.2f} sekunder tilbage".format(self.tidTilbage_minutter, self.tidTilbage_sekunder))
if self.tidTilbage < 0 or self.tidTilbage == 0 and self.timerValue > 0:
self.spilSlut = 1
elif self.stopButton == 1:
self.timerDisplay.config(text="Spillet er sat på pause")
def opdaterCountdownSpilSlut(self):
self.timerDisplay.config(text="Spillet er slut")
class Update(threading.Thread):
def __init__(self, tkinter):
threading.Thread.__init__(self)
self.daemon = True
self.tkinter = tkinter
self.start()
def run(self) -> None:
while True:
time.sleep(0.1)
self.tkinter.opdaterCountdown()
if self.tkinter.spilSlut == 1:
self.tkinter.opdaterCountdownSpilSlut()
time.sleep(1)
app = Tkinter()
导入线程
将tkinter作为tk导入
进口pip
导入时间
导入mysql.connector
从时间上导入睡眠
全球得分
全球倒计时
en=“1”
分数=0
倒计时=1
打印(“你好!”
Tkinter类(线程。线程):
定义初始化(自):
threading.Thread.\uuuuu init\uuuuuu(自)
self.daemon=True
self.root=0
self.entry=0
self.label=0
self.button=0
self.timerValue=2
self.stopButton=0
self.start()
self.spilSlut=0
def运行(自)->0:
self.root=tk.tk()
全球倒计时
#巴格朗德
self.root.geometry(“+2+0”)
self.root.config(background=“Grey”)
#时间值选择器
self.label=tk.label(self.root,bg=“白色”,fg=“黑色”,font=(“Fixedsys”,28))
self.entry=tk.entry(self.root,bg=“白色”,fg=“黑色”,font=(“Fixedsys”,28))
#启动/停止卸料器
self.stopTiden=tk.按钮(self.root,bg=“red”,fg=“white”,text=“Stop Spillet”,command=self.stopTid)
self.startTiden=tk.按钮(self.root,bg=“绿色”,fg=“白色”,text=“启动溢出”,command=self.startTid)
#泰默伦
self.timerDisplay=tk.Label(self.root,bg=“black”,fg=“red”,text=“Spillet er ikke startet”)
self.timerDisplay.grid(行=2,列=50)
self.startTiden.grid(行=0,列=1)
self.stopTiden.grid(行=0,列=10)
self.entry.grid(行=1,列=1)
self.label.grid(行=1,列=10)
self.root.bind(“,self.read)
自我更新(self)
self.root.mainloop()
def读取(自身、事件):
key=event.keysym
尝试:
如果键==“Return”:
self.getA()
self.visTid()
除:
self.fejltivalg()
def STARTID(自身):
self.stopButton=0
def getA(自我):
尝试:
self.timerValue=float(self.entry.get().format(“%.2f”,1.23456))
打印(self.timerValue)
返回self.timerValue
除:
打印(fejl)
def stopTid(自身):
self.stopButton=1
打印(“溢出器止动块nu”)
def visTid(自身):
self.label.config(text=“Det her er timerens slutværdi:{}”.format(self.timerValue))
def fejlTidvalg(自身):
self.label.config(text=“FEJL-Vælg Venligst Et Tal”)
def opdaterCountdown(自):
如果self.stop按钮!=1:
self.spilSlut=0
self.tidTilbage=self.timerValue-倒计时
self.tidtibage\u mintter=int(self.tidtibage/60)
self.tidtibage_sekunder=(self.tidtibage)-(self.tidtibage_minitter*60)
self.timerDisplay.config(text=“{}minuter,{.2f}sekunder tilbage.”格式(self.tiddilebage\u minuter,self.tiddilebage\u sekunder))
如果self.tidTilbage<0或self.tidTilbage==0且self.timerValue>0:
self.spilSlut=1
elif self.stopButton==1:
self.timerDisplay.config(text=“Spillet er sat påpause”)
def OPDATERCountdownSpilsult(自):
self.timerDisplay.config(text=“Spillet er slut”)
类更新(threading.Thread):
定义初始值(自,tkinter):
threading.Thread.\uuuuu init\uuuuuu(自)
self.daemon=True
self.tkinter=tkinter
self.start()
def运行(自)->无:
尽管如此:
睡眠时间(0.1)
self.tkinter.opdaterCountdown()
如果self.tkinter.spilSlut==1:
self.tkinter.opdaterCountdownSpilSlut()
时间。睡眠(1)
app=Tkinter()
为什么相同(完全相同)的GUI在第一种情况下工作,而在第二种情况下不工作
我有没有因为某种原因找不到的打字错误?还是我还错过了什么
两个GUI是完全相同的副本,1:1
这是一个错误的说法。一个做app=Tkinter()
,另一个做tk=Tkinter()
您正在使用tk
处理两种不同的事情:
import tkinter as tk
...
tk = Tkinter()
您需要更改最后一行以使用不同的变量名。在类中使用
global
是非常不鼓励的。我认为我们使用class
的原因之一是为了避免global
。self.start()
在哪里定义?@CoolCloud您引用的是哪个“全局”变量?Self.start()是一个预定义函数,AFAIK,它允许线程独立运行。全局倒计时
。此外,所有函数或类之外的global
也没有好处。是的,我没有注意到从线程继承的类。。。非常感谢你。
import tkinter as tk
...
tk = Tkinter()