2012-04-18 102 views
8

我在Rosetta Code - programming chrestomathy网站尝试了一个python代码示例,其中尽可能多的不同编程语言提供了对同一任务的解决方案。对于这个任务,目标是从图形用户界面输入一个字符串和整数75000。代码如下所示:最小tkSimpleDialog示例中的错误

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' 

可能在哪里这个问题呢?

感谢

+0

发布完整的追溯,而不仅仅是错误。我们需要查看错误代码。 – agf 2012-04-18 08:02:53

+0

@agf我编辑了问题以包含回溯。 – engineervix 2012-04-18 08:16:24

+0

我在Windows 7 Ultimate 32位上使用Python 2.7。 'root = Tkinter.tk()'不起作用,它给出'NameError:name''Tkinter'没有被定义' – engineervix 2012-04-18 08:28:37

回答

12

错误消息告诉您该对话框需要父窗口。

使用Python 2.x中,您创建了根窗口:

import Tkinter 
root = Tkinter.Tk() 

要隐藏根窗口,如果你不想要它,使用:

root.withdraw() 

Python Tkinter Docs为更多信息。

+0

* T * k代替tk ...顺便说一句。 – FabienAndre 2012-04-18 14:17:28

+0

@FabienAndre谢谢,修正。 – agf 2012-04-18 14:19:22

1

我从来没有用过askinteger,但它看起来像对话框需要知道其父的错误信息判断,但你不告诉它的父应该是什么。尝试添加parent=widget(其中“小部件”是对其他小部件的引用 - 通常是根小部件)。我找不到任何说明这是必需的文档,但我猜测它是因为除了根窗口以外的所有Tkinter窗口小部件都需要有父窗口。

如果您在问题中显示的代码是完整的代码,那么您错过了其他一些内容。您需要创建一个Tk类的实例(称为“根”窗口),并且您需要启动事件循环(尽管可能会由对话框运行它自己的事件循环,所以如果您需要的话您可能会确定是单个对话框)。