【问题标题】:Working on a way to return the text of a button after the button is clicked in tkinter研究在 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)

【问题讨论】:

标签: python button tkinter


【解决方案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 属性的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
相关资源
最近更新 更多