我正在尝试更新标签,但我写的代码每次都会创建一个新标签。我对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的错误。
答案 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()