使用以下代码,将隐藏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。
谢谢!
答案 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)