更新tkinter标签

时间:2016-11-28 13:49:50

标签: python python-3.x tkinter

我正在尝试更新标签,但我写的代码每次都会创建一个新标签。我对tkinter比较新,所以我无法理解如何将其他答案应用到我的代码中。

from tkinter import *
import random

class Window(Frame):

    def __init__(self, master=None):
        Frame.__init__(self, master) 
        self.master=master 
        self.init_window()

    def init_window(self): 
        self.pack(fill=BOTH, expand=1)
        testButton=Button(self, text="Press", command=calc)
        testButton.pack()
        l1=Label(text="")

    def testbutton(ans): #creates a new instance of l1 each time, I want to update existing l1
        var=StringVar()
        l1=Label(textvariable=var) #l1.configure() gives error l1 not defined
        var.set(ans)
        l1.pack()

def calc():
    list1=["a","b","c"]
    index=random.randint(0,2)
    answer=list1[index]
    Window.testbutton(answer)

root=Tk()
root.geometry("400x300")
app=Window(root)
root.mainloop()

每次按下该按钮,都会创建一个新标签,而不是更新现有标签上的文本。 这是我实际项目的简化版本,但突出了标签的问题。 我试过在testbutton函数中使用l1.configure(...)但是它运行了一个没有定义l1的错误。

2 个答案:

答案 0 :(得分:3)

为避免每次都创建新的Label,您需要创建一个并将其另存为Window实例的属性。为了使calc()函数可以访问它,您还需要将Window实例作为参数传递给它(以避免使用全局变量)。使用tkinter执行此操作的常见原因是使用lamba函数作为Button的{​​{1}}参数,并使command=成为其参数的默认值如下图所示。

self

答案 1 :(得分:0)

您可以使用类方法和属性 使用StringVar更改标签文字:

class Window(Frame):

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master = master
        self.init_window()

    def init_window(self):
        self.pack(fill=BOTH, expand=1)
        testButton = Button(self, text="Press", command=self.calc)
        testButton.pack()
        self.ltext = StringVar()
        l1 = Label(textvariable=self.ltext)
        l1.pack()

    def testbutton(self, ans):
        self.ltext.set(ans)

    def calc(self):
        list1 = ["a", "b", "c"]
        index = random.randint(0, 2)
        answer = list1[index]
        self.testbutton(answer)

root = Tk()
root.geometry("400x300")
app = Window(root)
root.mainloop()