在tkinter中实现按钮点击后返回按钮文本的方法

5 投票
2 回答
3630 浏览
提问于 2025-04-16 18:44

我正在尝试创建一个按钮列表,点击这些按钮时会用到这个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()

撰写回答