tkinter 标签,或“在循环中更新变量”

问题描述 投票:0回答:1

相关内容:

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()
python python-2.7 tkinter
1个回答
1
投票

我无法更新该标签,

创建

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()
© www.soinside.com 2019 - 2024. All rights reserved.