Объект 'str' не имеет атрибута 'get' в обратном вызове Tkinter - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь отследить выбор виджета OptionMenu, чтобы разные варианты запускали разные функции. Тем не менее, я продолжаю сталкиваться с ошибкой ниже:

Exception in Tkinter callback
Traceback (most recent call last):
  File "-", line 1705, in __call__
    return self.func(*args)
  File "-", line 149, in callback
    self.bookingCanvas(optVar)
  File "-", line 152, in bookingCanvas
    perfDate = optVar.get()
AttributeError: 'str' object has no attribute 'get'

Вот соответствующий код:

    optVar = StringVar(self.root)
    optVar.trace('r', callback=self.callback)
    optVar.set("06/10/20") # default value
    optMenu_Label = Label(self.root, text='Select a performance date:',bg='gray15', fg='yellow', relief=GROOVE)
    optMenu_Label.pack(side=TOP, anchor=NW, padx=15, pady=15)

    optMenu = OptionMenu(self.root, optVar, '04/10/20','5/10/20','6/10/20')
    optMenu.pack(side=TOP,anchor=NW, padx=35, pady=3)

Обратный вызов .trace () выше:

    def callback(self, optVar, *args):
    print("SOMETHING HAS CHANGED")
    self.bookingCanvas(optVar)

Область ошибок (я предполагаю):

    def bookingCanvas(self, optVar):
        perfDate = optVar.get()
        print("This is a Date >>>",perfDate)
        print("did we get here?")

1 Ответ

1 голос
/ 31 января 2020

Обратному вызову из трассировки присваивается имя переменной, а не ссылка на объект переменной. Имя представляет собой строку, поэтому вы получаете сообщение об ошибке AttributeError: 'str' object has no attribute 'get'.

С именем вы можете использовать метод общего виджета getvar, чтобы получить значение, хранящееся в переменной.

В вашем определении callback вы можете получить значение и передать его своей функции следующим образом: (при условии, что для этого примера у вас есть глобальная переменная с именем 'root`)

def callback(self, optVar_name, *args):
    print("SOMETHING HAS CHANGED")
    value = root.getvar(optVar_name)
    self.bookingCanvas(value)

С этим вы можете удалить вызов на get в bookingCanvas:

def bookingCanvas(self, perfDate):
    print("This is a Date >>>",perfDate)
    print("did we get here?")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...