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

Я тестировал пример кода python в Rosetta Code - сайте программирования хрестоматии, где решения к одной и той же задаче представлены как можно больше различных языков программирования. Для этой цели целью является ввод строки и целого числа 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'

Где может возникнуть проблема?

Спасибо

Ответ 1

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

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

import tkinter
from tkinter import simpledialog
root = tkinter.Tk()

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

root.withdraw()

Для получения дополнительной информации см. Документы Python Tkinter.

Ответ 2

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

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