Передача объекта в лямбду в обратный вызов кнопки tkinter - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь использовать лямбду для создания обратных вызовов для кнопок tkinter.

Есть несколько кнопок, и каждый обратный вызов должен передавать объект внутри него. Следующий код - то, что я делаю и работает нормально

var0 = tk.StringVar()    

label = tk.Label(top, bg = "White",height = 2, width = 12,textvariable=var0, justify="right")
def b0Callback(var):
  var.set(var.get()+"0")
return
# creating a label which will print value of the any of the 0-9 button pressed 

# creating a button 0 
b0 = tk.Button(numFrame0, height = 1, width = 4, bg = "grey", text = 
"0",command =  lambda: b0Callback(var0))

 #there are more buttons like that

var0 используется для обновления метки. Выше код работает нормально, но я должен создать обратный вызов от 0 до 9, и я должен просто повторить приведенное выше определение. Поэтому я попытался использовать следующий пример из этого учебника

def myfunc(n):
 return lambda a : a * n

mydoubler = myfunc(2)
mytripler = myfunc(3)

print(mydoubler(11)) 
print(mytripler(11))

Используя его, я сделал следующее

def Callback(n):
 return lambda var.set(var.get()+n)

b0Callback = Callback("0")

Показывает неверный индекс ошибки в строке возврата в var.set

Есть ли способ передать var0 в этом случае, чтобы избежать этой ошибки?

Ответы [ 2 ]

0 голосов
/ 05 января 2019

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

Позволяет сделать для него функцию, которая получает ваш StringVar () как переменную и добавляет к нему некоторое число:

def button_callback(str_var, number):
    str_var.set(str_var.get() + str(number))

Чтобы выполнить эту команду, мы просто помещаем ее в код как лямбда-функцию, иначе она будет выполняться при инициализации (потому что мы предоставляем функцию вместо ссылки).

Итак, чтобы запустить его внутри кнопки, мы объявляем это так:

my_button = Button(root, text='Some text here', command=lambda: button_callback(my_string_var, 5))

«5» может быть потенциально изменено на любое другое число.

0 голосов
/ 05 января 2019

Я теперь решил проблему, вот окончательный код:

Я также изменил количество кнопок на 300 и добавил код, чтобы расположить их в красивой сетке, просто для удовольствия. (Вы можете изменить это на любое количество, выбрав for number in range(1, whatever).

import tkinter as tk


class Window(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        self.var0 = tk.StringVar()
        self.var0.set('0')

        # creating buttons and adding them to dictionary
        self.buttons = {}
        for number in range(1, 301):
            self.buttons.update({'button' + str(number): tk.Button(self, height=1, width=4, bg="grey", text=number)})

        label = tk.Label(self, textvariable=self.var0, font='none 50')
        label.grid(column=0, row=0)

        for button in self.buttons:
            self.buttons[button].bind('<Button-1>', lambda event, num=button[6:]: self.Callback(event, num))

            self.buttons[button].grid(column=(int(button[6:]) % 10), row=(int(button[6:]) / 10) + 1)

    def Callback(self, event, num):
        self.var0.set(num)
        self.update()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...