Python 如何在计时器运行的情况下从单独的类更改Tkinter标签?

Python 如何在计时器运行的情况下从单独的类更改Tkinter标签?,python,tkinter,Python,Tkinter,我一直在制作一个简单的ClickerGUI作为一个宠物项目来提高我的编码技能,但是我遇到了一个绊脚石。我已经成功地创建了一个循环,该循环不会阻止我的GUI运行,但我需要在每次循环运行时更新GUI,因为GUI在我的循环的单独类中运行。有什么命令可以帮助我吗 import tkinter import math import threading import time global Level Level = 0 global Exp Exp = 0 global Mana Mana = 0 g

我一直在制作一个简单的ClickerGUI作为一个宠物项目来提高我的编码技能,但是我遇到了一个绊脚石。我已经成功地创建了一个循环,该循环不会阻止我的GUI运行,但我需要在每次循环运行时更新GUI,因为GUI在我的循环的单独类中运行。有什么命令可以帮助我吗

import tkinter
import math
import threading
import time


global Level
Level = 0
global Exp
Exp = 0
global Mana
Mana = 0
global Monsters
Monsters = 0
global Killed
Killed = 0
global Teachers
Teachers = 0
global Gold
Gold = 0
global Option
Option = 0


class Exp_per_second(object):

    def __init__(self, interval=0.5):

        self.interval = interval

        thread = threading.Thread(target=self.run, args=())
        thread.daemon = True
        thread.start()

    def run(self):
        while True:
            global Exp
            Exp = Exp + Teachers

            time.sleep(self.interval)


class simpleapp_tk(tkinter.Tk):
    def __init__(self, parent):
        tkinter.Tk.__init__(self, parent)
        self.parent = parent
        self.initialise()

    def initialise(self):
        self.grid()
        self.entryVariable = tkinter.StringVar()
        self.entry = tkinter.Entry(self,textvariable=self.entryVariable)

        self.labelVariable1 = tkinter.StringVar()
        label1 = tkinter.Label(self, textvariable=self.labelVariable1, anchor='w', fg='black')
        label1.grid(column=0, row=1, columnspan=2, stick='EW')
        self.labelVariable1.set(u"Experience:")

        self.labelVariable2 = tkinter.StringVar()
        label2 = tkinter.Label(self, textvariable=self.labelVariable2, anchor='w', fg='black')
        label2.grid(column=2, row=1, stick='EW')
        self.labelVariable2.set(Exp)

        button1 = tkinter.Button(self, text=u"    Learn    ", command=self.OnButtonClick1)
        button1.grid(column=0, row=4, columnspan=2)


    def New_Option1(self):
        self.labelVariable3 = tkinter.StringVar()
        label3 = tkinter.Label(self, textvariable=self.labelVariable3, anchor='w', fg='black')
        label3.grid(column=0, row=2,columnspan=2,  stick='EW')
        self.labelVariable3.set(u"         Mana:")

        self.labelVariable4 = tkinter.StringVar()
        label4 = tkinter.Label(self, textvariable=self.labelVariable4, anchor='w', fg='black')
        label4.grid(column=2, row=2, stick='EW')
        self.labelVariable4.set(Mana)

        self.labelVariable5 = tkinter.StringVar()
        label5 = tkinter.Label(self, textvariable=self.labelVariable5, anchor='w', fg='black')
        label5.grid(column=0, row=0,  stick='EW')
        self.labelVariable5.set('Level:')

        self.labelVariable6 = tkinter.StringVar()
        label6 = tkinter.Label(self, textvariable=self.labelVariable6, anchor='w', fg='black')
        label6.grid(column=1, row=0, stick='EW')
        self.labelVariable6.set(Level)

        button2 = tkinter.Button(self, text=u"Concentrate", command=self.OnButtonClick2)
        button2.grid(column=2, row=4)

def New_Option2(self):
        self.labelVariable6.set(Level)

        self.labelVariable7 = tkinter.StringVar()
        label7 = tkinter.Label(self, textvariable=self.labelVariable7, anchor='w', fg='black')
        label7.grid(column=0, row=3, columnspan=2, stick='EW')
        self.labelVariable7.set('   Monsters:')

        self.labelVariable8 = tkinter.StringVar()
        label8 = tkinter.Label(self, textvariable=self.labelVariable8, anchor='w', fg='black')
        label8.grid(column=2, row=3, stick='EW')
        self.labelVariable8.set(Monsters)

        button3 = tkinter.Button(self, text=u" Summon ", command=self.OnButtonClick3)
        button3.grid(column=0, row=5, columnspan=2)

        button4 = tkinter.Button(self, text=u"    Fireball    ", command=self.OnButtonClick4)
        button4.grid(column=2, row=5)

    def New_Option3(self):
        self.labelVariable6.set(Level)

        self.labelVariable9 = tkinter.StringVar()
        label9 = tkinter.Label(self, textvariable=self.labelVariable9, anchor='w', fg='black')
        label9.grid(column=3, row=0, stick='EW')
        self.labelVariable9.set('Gold:')

        self.labelVariable10 = tkinter.StringVar()
        label10 = tkinter.Label(self, textvariable=self.labelVariable10, anchor='w', fg='black')
        label10.grid(column=4, row=0, stick='EW')
        self.labelVariable10.set(Gold)

        self.labelVariable11 = tkinter.StringVar()
        label11 = tkinter.Label(self, textvariable=self.labelVariable11, anchor='w', fg='black')
        label11.grid(column=3, row=1, columnspan=2, stick='EW')
        self.labelVariable11.set('Teachers:')

        self.labelVariable12 = tkinter.StringVar()
        label12 = tkinter.Label(self, textvariable=self.labelVariable12, anchor='w', fg='black')
        label12.grid(column=5, row=1, stick='EW')
        self.labelVariable12.set(Teachers)

        button5 = tkinter.Button(self, text=u"     Hire     ", command=self.OnButtonClick5)
        button5.grid(column=3, row=4, columnspan=2)

        button6 = tkinter.Button(self, text=u"  Teacher  ", command=self.OnButtonClick6)
        button6.grid(column=3, row=5, columnspan=2)

    def OnButtonClick1(self):
        global Exp
        Exp = Exp + 2**Monsters
        self.labelVariable2.set(Exp)
        if Exp == 10 and Level == 0:
            global Level
            Level = 1
            self.New_Option1()

    def OnButtonClick2(self):
        if Exp >= 10:
            global Exp
            Exp = Exp - 10
            global Mana
            Mana = Mana + 1
            self.labelVariable2.set(Exp)
            self.labelVariable4.set(Mana)
            if Mana == 5 and Level == 1:
                global Level
                Level = 2
                self.New_Option2()

    def OnButtonClick3(self):
        if Mana >= 5:
            global Exp
            Exp = Exp + 5
            global Mana
            Mana = Mana - 5
            global Monsters
            Monsters = Monsters + 1
            self.labelVariable2.set(Exp)
            self.labelVariable4.set(Mana)
            self.labelVariable8.set(Monsters)

    def OnButtonClick4(self):
        if Monsters >= 1 and Mana >= 10:
            global Exp
            Exp = Exp + 20
            global Mana
            Mana = Mana - 10
            global Monsters
            Monsters = Monsters - 1
            global Killed
            Killed = Killed + 1
            global Gold
            Gold = Gold + 10
            if Level >= 3:
                self.labelVariable10.set(Gold)
            self.labelVariable2.set(Exp)
            self.labelVariable4.set(Mana)
            self.labelVariable8.set(Monsters)
            if Killed == 5 and Level == 2:
                Level = 3
                self.New_Option3()

    def OnButtonClick5(self):
        if Gold == 50 and Option == 1:
            global Gold
            Gold = Gold - 50
            global Teachers
            Teachers = Teachers + 1
            self.labelVariable10.set(Gold)
            self.labelVariable12.set(Teachers)

    def OnButtonClick6(self):
        global Option
        Option = 1
        button6 = tkinter.Button(self, text=u"  Teacher  ", command=self.OnButtonClick6, bg='gray')
        button6.grid(column=3, row=5, columnspan=2)



if __name__ == "__main__":
    Count1 = Exp_per_second()
    app = simpleapp_tk(None)
    app.title('Clicker')
    app.mainloop()

我知道我犯了一些错误,它相当混乱,但我使用python的时间不长,这是我试图学习的。这也是我第一次使用这个网站提问,但我之前确实尝试过一些研究,但似乎在任何地方都找不到解决方案。对代码的任何改进建议都很好。

您可以将
app
对象作为参数发送到
Exp\u per\u second()
(仅在创建app后创建),然后在
Exp\u per\u second()
类中将其设置为实例变量,然后在
run()中访问该对象
while循环中的方法。然后你可以随意修改它

示例/演示(此示例仅用于说明其工作原理)-

Exp\u per\u second()类更改为-

class Exp_per_second(object):

    def __init__(self, app, interval=0.5):

        self.interval = interval
        self.app = app
        thread = threading.Thread(target=self.run, args=())
        thread.daemon = True
        thread.start()

    def run(self):
        while True:
            global Exp
            Exp = Exp + Teachers
            self.app.labelVariable1.set(u"Experience:"+str(Exp))
            time.sleep(self.interval)
程序的主要部分看起来像-

if __name__ == "__main__":
    app = simpleapp_tk(None)
    app.title('Clicker')
    Count1 = Exp_per_second(app)
    app.mainloop()

您可以在本例中执行类似操作。

您可以将
app
对象作为参数发送到
Exp\u per\u second()
(仅在创建app后创建),然后在
Exp\u per\u second()
类中将其设置为实例变量,然后在
run()中访问该对象
while循环中的方法。然后你可以随意修改它

示例/演示(此示例仅用于说明其工作原理)-

Exp\u per\u second()类更改为-

class Exp_per_second(object):

    def __init__(self, app, interval=0.5):

        self.interval = interval
        self.app = app
        thread = threading.Thread(target=self.run, args=())
        thread.daemon = True
        thread.start()

    def run(self):
        while True:
            global Exp
            Exp = Exp + Teachers
            self.app.labelVariable1.set(u"Experience:"+str(Exp))
            time.sleep(self.interval)
程序的主要部分看起来像-

if __name__ == "__main__":
    app = simpleapp_tk(None)
    app.title('Clicker')
    Count1 = Exp_per_second(app)
    app.mainloop()

您可以在您的情况下执行类似的操作。

非常感谢。我一克服之前意外犯下的错误,问题就迎刃而解了。这也应该有助于我以后添加新的计时器,当我需要将它们分开时,但现在我想我可以将它们添加到同一个计数器中。非常感谢,当我克服之前意外犯下的错误时,它就解决了我的问题。这也应该有助于我以后添加新的计时器,当我需要将它们分开时,但现在我想我可以将它们添加到同一个计数器中