Как изменить текст кнопки в tkinter внутри функции обратного вызова - PullRequest
0 голосов
/ 21 октября 2018

Можно ли изменить текст кнопки при ее нажатии, даже если множество кнопок используют одну и ту же команду обратного вызова?

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)

Я знаю, что этот код не будет работать, потому что кнопкаэто не переменная, но это то, что я имел в виду для обратного вызова.(Я использую модуль tkinter в Python 3.7)

Ответы [ 3 ]

0 голосов
/ 21 октября 2018
 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()
0 голосов
/ 30 апреля 2019

Я бы использовал лямбду, чтобы передать значения в функции, чтобы вы могли кодировать, какая кнопка нажимается.Вот как это выглядело бы, если бы вы использовали лямбду в своих кнопках,

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)

Надеюсь, вы понимаете, что я здесь говорю.И если да, ответьте мне, насколько хорошо я вам это объяснил.

0 голосов
/ 21 октября 2018

Вы можете использовать лямбду, чтобы передать номер кнопки в качестве параметра функции обратного вызова:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...