Объявленные переменные не инициализируются при использовании 'simpledialog'

У меня проблема с некоторым кодом, над которым я работаю, когда пытаюсь передать переменную в поле "simpledialog". Тем не менее, когда я объявляю переменную в __init__ раздел, переменная не может быть доступна из любого другого метода в классе.

Я создал упрощенный рабочий пример, в котором я пытаюсь передать строку в поле ввода, чтобы при создании "simpledialog" поле ввода уже заполнялось. Затем значение можно изменить, и новое значение будет напечатано на консоли.

from tkinter import *
from tkinter.simpledialog import Dialog


class App(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent

        Button(parent, text="Press Me", command=self.run).grid()

    def run(self):
        number = "one"
        box = PopUpDialog(self, title="Example", number=number)
        print(box.values)

class PopUpDialog(Dialog):
    def __init__(self, parent, title, number, *args, **kwargs):
        Dialog.__init__(self, parent, title)
        self.number = number

    def body(self, master):
        Label(master, text="My Label: ").grid(row=0)
        self.e1 = Entry(master)
        self.e1.insert(0, self.number)  # <- This is the problem line
        self.e1.grid(row=0, column=1)

    def apply(self):
        self.values = (self.e1.get())
        return self.values

if __name__ == '__main__':
    root = Tk()
    app = App(root)
    root.mainloop()

Когда код запускается и кнопка "Нажми меня" нажата, я получаю следующее сообщение об ошибке:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__
    return self.func(*args)
  File "C:/Python/scratch.py", line 14, in run
    box = PopUpDialog(self, title="Example", number=number)
  File "C:/Python/scratch.py", line 20, in __init__
    Dialog.__init__(self, parent, title)
  File "C:\Python34\lib\tkinter\simpledialog.py", line 148, in __init__
    self.initial_focus = self.body(body)
  File "C:/Python/scratch.py", line 26, in body
    self.e1.insert(0, self.number)
AttributeError: 'PopUpDialog' object has no attribute 'number'

Если я закомментирую self.e1.insert(0, self.number)иначе код будет работать.

Кажется, что есть немного документации по "simpledialog", и я использовал примеры на effbot.org, чтобы попытаться узнать больше о диалоговых окнах.

В качестве примечания, если я вставлю print(number) линия в __init__ метод класса PopUpDialog, номер будет выведен на консоль. Кроме того, если я инициализирую self.number переменная (например, self.number = "example") в методе body() код работает как положено.

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

1 ответ

Решение

Проблема в вашем PopUpDialog класс, у функции __init__ ты звонишь на линию Dialog.__init__(self, parent, title) это вызывает метод тела. Проблема в том, что вы инициализируете self.number на следующей строке, и именно поэтому self.number еще не инициализируется при методе body.

Если вы переключите линии, это будет работать для вас, вот так:

class PopUpDialog(Dialog):
    def __init__(self, parent, title, number, *args, **kwargs):
        self.number = number
        Dialog.__init__(self, parent, title)

РЕДАКТИРОВАТЬ:

Как вы можете видеть на __init__ В методе диалога есть строка выше:

self.initial_focus = self.body(body) это вызывает метод вашего тела.

Другие вопросы по тегам