在tkinter中实现按钮点击后返回按钮文本的方法
我正在尝试创建一个按钮列表,点击这些按钮时会用到这个lambda函数:
button1.config(command=(lambda x: (clicked.append(x)))(button1.cget("text")))
看起来这个函数有点效果,但它会立即打印出按钮的文本,也就是说,它并不会等用户点击按钮后再打印。
有没有什么办法可以让它在用户点击按钮后再响应呢?
class GraphicsInterface:
def __init__(self):
self.window = Tk()
self.window.geometry("720x500")
clicked=[]
button1 = Button(self.window, text="Dice 1", width=13)
button1.place(x=60, y=160)
button1.config(command=(lambda x: (clicked.append(x)))(button1.cget("text")))
print(clicked)
2 个回答
2
一种方法是把按钮点击事件绑定到一个函数,这个函数会把文本添加到你的 clicked
列表中。例如:
self.clicked=[]
self.button1 = Button(self.window, text="Dice 1", width=13)
self.button1.place(x=60, y=160)
self.button1.bind("<Button-1>",self.callback)
def callback(self,event):
self.clicked.append(event.widget.cget("text"))
你还可以添加其他按钮,这些按钮也会调用 callback
函数,并通过 event
参数获取它们的文本。
3
在一个lambda里尝试做这些事情是个错误的做法。这实在是太复杂了,甚至可能做不到你想要的。相反,应该创建一个方法来完成这些工作,然后只把lambda当作调用这个方法的方式:
from Tkinter import *
class GraphicsInterface:
def __init__(self):
self.window = Tk()
self.window.geometry("720x500")
self.clicked=[]
button1 = Button(self.window, text="Dice 1", width=13)
button2 = Button(self.window, text="Dice 2", width=13)
button1.pack()
button2.pack()
button1.configure(command=lambda btn=button1: self.OnClick(btn))
button2.configure(command=lambda btn=button2: self.OnClick(btn))
self.window.mainloop()
def OnClick(self, btn):
text = btn.cget("text")
self.clicked.append(text)
print "clicked:", self.clicked
app = GraphicsInterface()