相关内容:
Python 2.7
,tkinter
。
好吧,我正在运行一个简单的程序,它基本上生成一个随机数,并返回一个语句作为结果。我认为给它提供按钮和显示屏来学习使用 GUI 会很有趣。由于我没有什么正确使用类的经验,所以我也将其作为一个类,我知道它没有必要,但它有助于我熟悉类。
现在进入正题!我无法更新 dang 标签,更糟糕的是,回溯似乎表明正在发生一些奇怪的事情。
我已经阅读了有关
tkinter
label
、StringVar
和 Set
的相关文档,但我不知道出了什么问题。每次程序运行时,我的回溯也会变得更长,也就是说,第一次,我得到一个“变量已更改!”,第二次,我得到两个“变量已更改!”,每次都会增加。
其要点是,我不知道为什么我的标签没有更新,也不知道还能去哪里查看,我确信这是显而易见的。
无论如何,这是代码:
from random import randint
from Tkinter import *
from sys import exit
class GUI:
def __init__(self, master):
frame = Frame(master)
frame.pack()
self.rooms = Button(frame, text = "All Rooms", fg = "blue", command=self.allrooms)
self.rooms.pack(side=LEFT)
self.alsoquit = Button(frame, text = "Quit", fg = "green", command=frame.quit)
self.alsoquit.pack(side=LEFT)
self.displaytext = StringVar()
self.displaytext.set("hello")
self.display = Label(master, text=self.displaytext)
self.display.pack(side=LEFT)
def callback(*args):
print "variable changed!"
def roomselect(self, random):
if random == 1:
self.displaytext.set("The Chest!")
self.displaytext.trace("w", self.callback)
elif random == 2:
self.displaytext.set("Dark Chest")
self.displaytext.trace("w", self.callback)
elif random == 3:
self.displaytext.set("Hush")
self.displaytext.trace("w", self.callback)
else:
quit()
def allrooms(self):
random = randint(1,3)
self.roomselect(random)
root = Tk()
app = GUI(root)
root.mainloop()
root.destroy()
我无法更新该标签,
创建
textvariable
小部件时指定 text
,而不是 Label
:
self.display = Label(master, textvariable=self.displaytext)
每次程序运行时,我的回溯也会变得更长,即 第一次,我得到一个“变量已更改!”,第二次,我得到两个 “变量改变了!”,每次都增加。
因为
self.displaytext.trace("w", self.callback)
会被多次调用(每次单击按钮时都会调用 allrooms
-> 依次调用 roomselect
-> 调用 trace
)。仅调用一次(例如,仅在 __init__
中):
from random import randint
from Tkinter import *
class GUI:
def __init__(self, master):
frame = Frame(master)
frame.pack()
self.rooms = Button(frame, text = "All Rooms", fg = "blue",
command=self.allrooms)
self.rooms.pack(side=LEFT)
self.alsoquit = Button(frame, text = "Quit", fg = "green",
command=frame.quit)
self.alsoquit.pack(side=LEFT)
self.displaytext = StringVar()
self.displaytext.set("hello")
self.displaytext.trace("w", self.callback) # <---
self.display = Label(master, textvariable=self.displaytext) # <---
self.display.pack(side=LEFT)
def callback(*args):
print "variable changed!"
def roomselect(self, random):
if random == 1:
self.displaytext.set("The Chest!")
elif random == 2:
self.displaytext.set("Dark Chest")
elif random == 3:
self.displaytext.set("Hush")
else:
quit()
def allrooms(self):
random = randint(1,3)
self.roomselect(random)
root = Tk()
app = GUI(root)
root.mainloop()