当按下按钮1时,我希望这个程序说"嗨",当按下按钮2时,我想让它在说嗨的同一位置说"再见",并覆盖按钮1产生的内容。然而,它并没有覆盖它,只是将两个标签合并在一起。在确保两个标签出现在同一位置的同时,有什么好方法可以防止这种情况发生?
from tkinter import *
root = Tk()
def press():
word = Label(root, text='hi')
word.grid(row=0, column=1)
def press_2():
word_2 = Label(root, text='goodbye')
word_2.grid(row=0, column=1)
button_1 = Button(root, text=1, command=press)
button_2 = Button(root, text=2, command=press_2)
button_1.grid(row=0, column=0)
button_2.grid(row=1, column=0)
root.mainloop()
您只需要使用一个Label
并不断更改其文本。我们可以通过为小部件command
使用lambda
来有效地做到这一点。正如@Bryan Oakley所说,使用StringVar
会增加不必要的开销。这是一个从我原来的略有修改的版本。在这个版本中,我们使用小部件的config
方法来设置文本。作为奖励,代码采用类结构进行格式化。在tkinter
中使用程序化风格最终会变成一团乱麻。考虑到所需的导入是最少的,我们直接导入它们,不需要为每个小部件加前缀。
from tkinter import Tk, Button, Label
class Application(Tk):
def __init__(self, *args, **kwargs):
Tk.__init__(self, *args, **kwargs)
lbl = Label(self, text='hi')
lbl.grid(row=0, column=1)
btn1 = Button(self, text='1',)
btn1.config(command=lambda m='hi': lbl.config(text=m))
btn1.grid(row=0, column=0)
btn2 = Button(self, text='2')
btn2.config(command=lambda m='goodbye': lbl.config(text=m))
btn2.grid(row=1, column=0)
if __name__ == "__main__":
app = Application()
app.minsize(100, 50)
app.title("My Application")
app.mainloop()
from tkinter import *
root = Tk()
def press():
label['text'] = "hi"
def press_2():
label['text'] = "goodbye"
label = Label(root)
label.grid(row=0, column=1)
button_1 = Button(root, text=1, command=press)
button_2 = Button(root, text=2, command=press_2)
button_1.grid(row=0, column=0)
button_2.grid(row=1, column=0)
root.mainloop()
首先将其放在窗口上,然后更改text
配置。
更好的方法是使用小部件的config()
方法。但在这里,我不知道它是否会有多大帮助。但试试
from tkinter import *
root = Tk()
def press():
word.config(text='hi')
def press_2():
word.config(text='goodbye')
button_1 = Button(root, text=1, command=press)
button_2 = Button(root, text=2, command=press_2)
button_1.grid(row=0, column=0)
button_2.grid(row=1, column=0)
word = Label(root, text='') #creating a blank label to edit later on in functions
word.grid(row=0, column=1)
root.mainloop()