Объявленные переменные не инициализируются при использовании '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)
это вызывает метод вашего тела.