Python 特金特圭元';t Start-Thread-Tkinter对象没有属性';标签';

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

我有一个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()
我一直在论坛上寻找解决方案,结果通常是在定义函数/变量之前运行函数/变量。问题是,我在运行它之前已经定义了它,并且,完全相同的代码在我的第一个程序中运行得非常好

我的第一个程序的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()