Python 正在研究在tkinter中单击按钮后返回按钮文本的方法
我正在尝试创建使用此lambda函数单击的按钮列表:Python 正在研究在tkinter中单击按钮后返回按钮文本的方法,python,button,tkinter,Python,Button,Tkinter,我正在尝试创建使用此lambda函数单击的按钮列表: button1.config(command=(lambda x: (clicked.append(x)))(button1.cget("text"))) from Tkinter import * class GraphicsInterface: def __init__(self): self.window = Tk() self.window.geometry("720x500")
button1.config(command=(lambda x: (clicked.append(x)))(button1.cget("text")))
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()
这似乎是一种工作,但它会立即打印按钮文本,即它不会等待用户单击按钮
关于如何使其对按钮点击做出响应,有什么想法吗
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)
一种方法是将button click事件绑定到一个函数,该函数将文本附加到您的
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"))
self.clicked=[]
self.button1=按钮(self.window,text=“骰子1”,宽度=13)
自身按钮1.位置(x=60,y=160)
self.button1.bind(“,self.callback)
def回调(自身、事件):
self.clicked.append(event.widget.cget(“文本”))
然后,您可以添加其他按钮,这些按钮也调用
回调
,并通过事件
参数获取它们的文本。尝试在lambda中执行所有这些操作是错误的方法。这太令人困惑了,如果不是不可能做到你想要的。相反,创建一个执行该操作的方法,并仅将lambda用作调用该函数的一种方式:
button1.config(command=(lambda x: (clicked.append(x)))(button1.cget("text")))
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()
我认为这是一个完全相同的副本,请确认:如果您使用键盘调用按钮(使用tab键将焦点移动到按钮上,然后按空格键),则这有不起作用的缺点。啊,是的,效果很好。然而,你能解释为什么lambda是必要的吗?例如,我尝试了button1.configure(command=self.OnClick(button1)),这导致了与以前相同的问题。为什么它在用户单击之前调用这里的函数?另外,我一般不太熟悉lambda…你能特别解释一下“lambda btn=button1”的语法吗?@sq1020:lamda是必要的,因为没有它,或者类似于
functools.partial
,就无法向回调传递参数。这是因为必须为命令
选项提供对函数的引用lambda
方便地返回匿名函数的句柄。当您执行command=self.OnClick(button1)
时,您要求python运行命令self.OnClick(button1)
,并将其结果用作command
属性的值。