Вопрос по python – Ошибка в минимальном примере tkSimpleDialog

10

Я пробовал пример кода Python вРозетта код - апрограммирование хрестоматии сайт, где решения одной и той же задачи представлены на максимально возможном количестве языков программирования. Для этой задачи цель состоит в том, чтобы ввести строку и целое число 75000 из графического интерфейса пользователя. Код показан ниже:

import tkSimpleDialog

number = tkSimpleDialog.askinteger("Integer", "Enter a Number")
string = tkSimpleDialog.askstring("String", "Enter a String")

Однако, когда я пытаюсь запустить код, я получаю следующую ошибку:

Traceback (most recent call last):
  File "C:\Users\vix\Documents\.cache\GUIexample.py", line 3, in <module>
    number = tkSimpleDialog.askinteger("Integer", "Enter a Number")
  File "C:\Python27\lib\lib-tk\tkSimpleDialog.py", line 262, in askinteger
    d = _QueryInteger(title, prompt, **kw)
  File "C:\Python27\lib\lib-tk\tkSimpleDialog.py", line 189, in __init__
    Dialog.__init__(self, parent, title)
  File "C:\Python27\lib\lib-tk\tkSimpleDialog.py", line 53, in __init__
    if parent.winfo_viewable():
AttributeError: 'NoneType' object has no attribute 'winfo_viewable'

Где может быть проблема?

Спасибо

Опубликовать полный трекбек, а не только ошибку Нам нужно увидеть код ошибки. agf
@agf Я отредактировал вопрос, добавив в него трассировку. engineervix
@agf Спасибо за внимание, создание корневого окна - вот что требуется здесь. Ваше предложение:import Tkinter а потомroot = Tkinter.Tk() работает, однако нужно добавитьroot.withdraw() завершить решение. Вы можете опубликовать ответ. engineervix
Я использую Python 2.7 в Windows 7 Ultimate, 32-разрядная версия.root = Tkinter.tk() не работает, это даетNameError: name 'Tkinter' is not defined engineervix

Ваш Ответ

2   ответа
15

что диалоговое окно нуждается в родительском окне.

В Python 2.x вы создаете корневое окно с помощью:

import Tkinter
root = Tkinter.Tk()

Чтобы скрыть корневое окно, если оно вам не нужно, используйте:

root.withdraw()

УвидетьPython Tkinter Docs для получения дополнительной информации.

@FabienAndre Спасибо, исправлено.
TK вместо TK ... Правильный ответ, кстати.
1

askintegerно, судя по сообщению об ошибке, похоже, что диалоговое окно должно знать своего родителя, но вы не говорите ему, каким должен быть его родитель. Попробуйте добавитьparent=widget (где «виджет» - это ссылка на какой-то другой виджет - обычно это корневой виджет). Я не могу найти никакой документации, в которой говорится, что это требуется, но я предполагаю, что это так, поскольку все виджеты Tkinter, кроме корневого окна, должны иметь родителя.

Если код, который вы показываете в своем вопросе, является полным кодом, вы упускаете некоторые другие вещи. Вам нужно создать экземплярTk класса (называемого окном «root»), и вам нужно запустить цикл событий (хотя, возможно, что диалог запускает собственный цикл событий, так что вы можете быть в порядке, если все, что вам нужно, - это единственный диалог ).

Похожие вопросы