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

Posted

技术标签:

【中文标题】研究在 tkinter 中单击按钮后返回按钮文本的方法【英文标题】:Working on a way to return the text of a button after the button is clicked in tkinter 【发布时间】:2011-09-05 22:41:28 【问题描述】:

我正在尝试创建一个使用此 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)

【问题讨论】:

我认为是一模一样,请确认:***.com/questions/6192727/… 【参考方案1】:

一种方法是将按钮单击事件绑定到将文本附加到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 参数获取它们的文本。

【讨论】:

如果您使用键盘调用按钮(使用 tab 将焦点移动到按钮,然后按空格键),这将无法正常工作。【参考方案2】:

试图在 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()

【讨论】:

啊,是的,效果很好。但是,您能解释一下为什么需要 lambda 吗?例如,我尝试了 button1.configure(command=self.OnClick(button1)) 导致与以前相同的问题。为什么它在用户点击之前调用了这里的函数?另外,我一般对 lambda 不是很熟悉……你能具体解释一下“lambda btn=button1”的语法吗? @sq1020: lamda 是必要的,因为没有它,或者像functools.partial 这样的东西,就无法将参数传递给回调。这是因为必须为 command 选项提供对函数的引用。 lambda 方便地返回匿名函数的句柄。当您执行command=self.OnClick(button1) 时,您要求python 运行命令self.OnClick(button1) 并将其结果用作command 属性的值。

以上是关于研究在 tkinter 中单击按钮后返回按钮文本的方法的主要内容,如果未能解决你的问题,请参考以下文章

如何通过单击tkinter中不同窗口中的按钮来获取位于窗口中的GUI文本字段的参数? [重复]

tkinter 按钮回调中的 Lambda 函数

Python3 tkinter基础 Button command 单击按钮 在console中打印文本

单击后更新按钮的位置? (Tkinter Python GUI)

Tkinter - 单击默认情况下未设置的按钮后无法获取单选按钮值

单击按钮后如何将输入值(TKinter)传递给其他类中的函数并使用传递的值运行函数[重复]