python-3.x 如何在回调函数中更改tkinter中按钮的文本

k7fdbhmy  于 2022-11-19  发布在  Python
关注(0)|答案(4)|浏览(180)

是否可以在按下按钮时更改按钮上的文本,即使有很多按钮使用同一个回调命令?

button1 = Button(self, text="1", command=self.getPressed)
button2 = Button(self, text="2", command=self.getPressed)

button1.grid(row=0, column=0)
button2.grid(row=0, column=1)

def getPressed(self):
    button.config(self, text="this has been pressed", state=DISABLED)

我知道这段代码不起作用,因为button不是变量,但这正是我对回调的想法。(我使用的是python 3.7中的tkinter模块)

lstz6jyr

lstz6jyr1#

可以使用lambda将按钮的编号作为参数传递给回调函数:

command=lambda:self.getPressed(1)

然后使用if来确定按下了哪个按钮。或者可以将按钮存储在列表中,然后只将索引传递给回调函数。
不使用类表示法的示例:

from tkinter import *

root = Tk()

def getPressed(no):
    button_list[no].config(text="this has been pressed", state=DISABLED)

button_list = []
button_list.append(Button(text="1", command=lambda:getPressed(0)))
button_list.append(Button(text="2", command=lambda:getPressed(1)))

button_list[0].grid(row=0, column=0)
button_list[1].grid(row=0, column=1)

root.mainloop()
vcirk6k6

vcirk6k62#

button1 = Button(..., command=lambda widget="button1": DoSomething(widget))

你必须把小部件引用传递给回调函数,你可以这样做:

import tkinter as tk

   main = tk.Tk()
   def getPressed(button):
            tk.Button.config(button, text="this has been pressed", state = tk.DISABLED)

   button1 = tk.Button(main, text="1", command=lambda widget='button1': getPressed(button1))
   button2 = tk.Button(main, text="2", command=lambda widget = 'button2': getPressed(button2))
   button1.grid(row=0, column=0)
   button2.grid(row=0, column=1)
   main.mainloop()
yftpprvb

yftpprvb3#

我所要做的就是使用lambda将值传递给函数,这样你就可以编写按钮被按下的代码。

self.Button1 = Button(self, text="1", command=lambda: getPressed(1))

如果你这样做。你可以定义一个方法,它将接受该参数并将其转换为字符串。如果该值等于“1”:如果值等于“2”,则执行以下操作:对那个按钮做点什么
如果我把这些知识应用到你的工作中。它会看起来像这样。

button1 = Button(self, text="1", command=self.getPressed)
button2 = Button(self, text="2", command=self.getPressed)

button1.grid(row=0, column=0)
button2.grid(row=0, column=1)

def getPressed(self, number):
    if(number == "1"):
      button1.config(self, text="this button has been pressed", state=DISABLED)
    elif(number == "2"):
      button2.config(self, text="Button 2 has been pressed" state=DISABLED)

我希望你能理解我在这里说的话。如果你理解了,请回复我,告诉我我解释得有多好。

oyxsuwqo

oyxsuwqo4#

我知道这个答案是在这个问题4年后出现的,但也许有人会发现这个解决方案很有用。可以做的是使用partial函数和对按钮的引用,并在按钮创建后使用button.update(command=...)来设置命令。
这样我们就避免了用按钮创建一个单独的列表,我发现它更干净。而且,如果需要的话,可以传递额外的参数。

from functools import partial

button1 = Button(self, text="1")
button1.update(command=partial(self.getPressed, button1))
button2 = Button(self, text="2")
button2.update(command=partial(self.getPressed, button2))

button1.grid(row=0, column=0)
button2.grid(row=0, column=1)

def getPressed(self, button):
    button.config(self, text="this has been pressed", state=DISABLED)

相关问题