2016-10-06 3 views
0

、Tkinterのルートウィンドウが表示されません。Tkinterの.withdraw()奇妙な行動

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を使用しています。

ありがとうございます!関数が定義されている場合、デフォルトの引数が評価されるためはすぐは、open(tkFileDialog.askopenfilename(),'r')を実行することを

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

答えて

2

あなたがこれを行います。したがって、2番目のコードブロックを実行すると、インタプリタは必要な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) 
+0

偉大な説明と、本当に便利な、感謝を! –