11

私はRosettaCodeでPythonコードの例を試していました。これは、プログラミングのchrestomathyサイトであり、同じタスクのソリューションが可能な限り多くの異なるプログラミング言語で提示されています。このタスクの目標は、グラフィカルユーザーインターフェイスから文字列と整数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'

問題はどこにあるのでしょうか?

ありがとう

4

2 に答える 2

19

エラーメッセージは、ダイアログに親ウィンドウが必要であることを示しています。

Python 2.xでは、次のコマンドでルートウィンドウを作成します。

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

ルートウィンドウが不要な場合に非表示にするには、次を使用します。

root.withdraw()

詳細については、PythonTkinterDocsを参照してください。

于 2012-04-18T14:08:36.703 に答える
1

私はこれまで使用askintegerしたことがありませんが、エラーメッセージから判断すると、ダイアログはその親を知る必要があるように見えますが、その親がどうあるべきかを伝えていません。追加してみてくださいparent=widget(「ウィジェット」は他のウィジェット(通常はルートウィジェット)への参照です)。これが必要であると述べているドキュメントは見つかりませんが、ルートウィンドウを除くすべてのTkinterウィジェットに親が必要なためだと思います。

質問に表示するコードが完全なコードである場合、他のいくつかが欠落しています。クラスのインスタンスTk(「ルート」ウィンドウと呼ばれる)を作成し、イベントループを開始する必要があります(ただし、ダイアログが独自のイベントループを実行する可能性があるため、必要なものがすべてあれば問題ありません。単一のダイアログ)。

于 2012-04-18T10:47:25.103 に答える