Tkinter .withdraw()奇怪的行为

时间:2016-10-06 06:37:02

标签: python python-2.7 tkinter

使用以下代码,将隐藏Tkinter根窗口:

def main():
    root = Tkinter.Tk()
    root.iconify()
    a = open(tkFileDialog.askopenfilename(), 'r')

main()

但是,使用此变体,根窗口将不会被隐藏:

class Comparison:
    def __init__(self, file=open(tkFileDialog.askopenfilename(),'r')):
        self.file = file
        self.length = sum(1 for _ in self.file)

def main():
    root = Tkinter.Tk()
    root.iconify()
    a = Comparison()

main()

为什么用构造函数调用tkFileDialog.askopenfilename会导致这种行为?我尝试了root.withdraw()root.iconify()并遇到了相同的行为。

值得注意的是,我使用的是OSX 10.11.6。

谢谢!

1 个答案:

答案 0 :(得分:2)

执行此操作时:

def __init__(self, file=open(tkFileDialog.askopenfilename(),'r')):

立即运行open(tkFileDialog.askopenfilename(),'r'),因为在定义函数时会计算默认参数。因此,当您运行第二个代码块时,解释器会创建一个必要的Tkinter根窗口,并在仍然定义该类时打开该文件选择器。 之后,您定义了一个函数main。最后,调用main(),它创建一个根对象,撤消它,并实例化Comparison类的对象。您使用root = Tkinter.Tk() 明确创建的根窗口是隐藏的。然而,较旧的一个,即Python被迫创建以便文件对话存在,但不是。

要解决此问题,请将默认行为放入方法正文而不是其签名:

class Comparison:
    def __init__(self, file=None):
        if file is None:
            self.file = open(tkFileDialog.askopenfilename(),'r')
        else:
            self.file = file
        self.length = sum(1 for _ in self.file)