Python 如何在计时器运行的情况下从单独的类更改Tkinter标签?
我一直在制作一个简单的ClickerGUI作为一个宠物项目来提高我的编码技能,但是我遇到了一个绊脚石。我已经成功地创建了一个循环,该循环不会阻止我的GUI运行,但我需要在每次循环运行时更新GUI,因为GUI在我的循环的单独类中运行。有什么命令可以帮助我吗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
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()
您可以在您的情况下执行类似的操作。非常感谢。我一克服之前意外犯下的错误,问题就迎刃而解了。这也应该有助于我以后添加新的计时器,当我需要将它们分开时,但现在我想我可以将它们添加到同一个计数器中。非常感谢,当我克服之前意外犯下的错误时,它就解决了我的问题。这也应该有助于我以后添加新的计时器,当我需要将它们分开时,但现在我想我可以将它们添加到同一个计数器中