Tkinter GUI 无法启动 - 线程 - Tkinter 对象没有属性 'Label'
Tkinter GUI Won't Start - Thread - Tkinter object has no attribute 'Label'
我有一个 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 = "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()
我得到的错误是这样的:
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Users\Mandem\AppData\Local\Programs\Python\Python38-32\lib\threading.py", line 932, in _bootstrap_inner
self.run()
File "C:/Users/Mandem/AppData/Local/Programs/Python/Python38-32/Lib/site-packages/mysql/connector/PC-ADMIN-Camper.py", line 81, in run
self.label = tk.Label(self.root, bg="white", fg="black", font=("Fixedsys", 28))
AttributeError: 'Tkinter' object has no attribute 'Label'
我一直在论坛上寻找解决方案,结果通常是关于 运行 和 function/variable 的东西才定义它。问题是,我已经在 运行 之前定义了它,并且完全相同的代码在我的第一个程序中运行得非常好。
我的第一个程序的 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()
为什么相同(完全相同)的 GUI 在第一个工作,但在第二个却不行?
我是不是打错了,不知为何找不到?或者还有什么我遗漏的吗?
The two GUI's are exact copies, 1:1.
这是一个错误的陈述。一个做 app = Tkinter()
,另一个做 tk = Tkinter()
。
您将 tk
用于两种不同的用途:
import tkinter as tk
...
tk = Tkinter()
您需要更改最后一行以使用不同的变量名称。
我有一个 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 = "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()
我得到的错误是这样的:
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Users\Mandem\AppData\Local\Programs\Python\Python38-32\lib\threading.py", line 932, in _bootstrap_inner
self.run()
File "C:/Users/Mandem/AppData/Local/Programs/Python/Python38-32/Lib/site-packages/mysql/connector/PC-ADMIN-Camper.py", line 81, in run
self.label = tk.Label(self.root, bg="white", fg="black", font=("Fixedsys", 28))
AttributeError: 'Tkinter' object has no attribute 'Label'
我一直在论坛上寻找解决方案,结果通常是关于 运行 和 function/variable 的东西才定义它。问题是,我已经在 运行 之前定义了它,并且完全相同的代码在我的第一个程序中运行得非常好。
我的第一个程序的 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()
为什么相同(完全相同)的 GUI 在第一个工作,但在第二个却不行?
我是不是打错了,不知为何找不到?或者还有什么我遗漏的吗?
The two GUI's are exact copies, 1:1.
这是一个错误的陈述。一个做 app = Tkinter()
,另一个做 tk = Tkinter()
。
您将 tk
用于两种不同的用途:
import tkinter as tk
...
tk = Tkinter()
您需要更改最后一行以使用不同的变量名称。