Python 正在研究在tkinter中单击按钮后返回按钮文本的方法

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")

我正在尝试创建使用此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()
这似乎是一种工作,但它会立即打印按钮文本,即它不会等待用户单击按钮

关于如何使其对按钮点击做出响应,有什么想法吗

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
属性的值。