2013-03-11 41 views
1

我正在写一个模块,我想支持弹出对话框来指示错误,但我不需要或不需要根窗口(因为我希望模块独立于主GUI和可在多个呼叫应用程序之间共享)。我试图干脆这样做:使用tkMessageBox而不导入Tkinter

import tkMessageBox 
[...stuff...] 
if (errorCondition): tkMessageBox.showwarning("My Module","That won't work!") 

...但是当我运行它时,一个根窗口出现在消息框旁边。我知道withdraw()方法,但由于我从未导入Tkinter本身并从未实例化过Tkinter.Tk(),所以我没有任何对象可以使用withdraw()

的作品是继续前进,导入Tkinter,无论如何,这样我就可以创建根窗口自己,然后withdraw()替代它:

import Tkinter 
import tkMessageBox 
root = Tkinter.Tk() 
root.withdraw() 
[...stuff...] 
if (errorCondition): tkMessageBox.showwarning("My Module","That won't work!") 

...但即使这样的作品,似乎klunky到引入一个模块并实例化一个对象,以便我可以摆脱它。另外我不想混淆这个根和调用应用程序中的“真正”根。

回到第一个例子,很显然tkMessageBox正在做一些事情来自己创建根窗口。有没有什么办法可以抢到那个根窗口的引用,所以我可以withdraw()呢?

(环境是Windows 7和Python 2.7.3。)

回答

2

tkMessageBox是建立在Tkinter的顶部,所以不可能简单地摆脱它:该模块的所有功能,如tkMessageBox.showwarning,是_show函数的封装。此函数创建一个Message对象,其中不同的参数取决于您使用的对话类型。 MessageDialog的一个子类,它又是Toplevel的子类。

Toplevel是Tkinter的部件,所以该模块(除了评论)其中Dialog被定义的第一行是:

from Tkinter import * 

你的第二解决方案是正确使用tkMessageBox的唯一方式,由于你不得不使用(至少在内部)Tkinter。

参考文献:

+0

感谢您的答案,尤其是链接。即使我无法撤消自动创建的根窗口,但我仍然可以获得我想要的结果,因为如果我已经在自己的调用应用程序中创建了一个根窗口,它将不会首先创建该根窗口。 (在任何情况下,我都会使用这个模块。) – JDM 2013-03-11 18:17:31

+0

@JDM自动生成的根窗口可以通过创建没有'master'参数的窗口部件来访问,然后撤回它的父窗口,比如'Tkinter.Button() .master.withdraw()'。但是,这是一个丑陋的解决方案,您的解决方案更加明确。 – 2013-03-11 18:43:18

0

注意:tkMessageBox不使用tkSimpleDialog,它使用tkCommonDialog。 tkCommonDialog的代码是 here

+0

虽然这个链接可能会回复这个问题,但请在这里发帖回答OP问题的相关部分,记住一个链接可以打破和/或过时 – 2015-02-10 13:18:14