2017-10-25 11 views
-1

別のウィンドウを作成するボタンでウィンドウを作成しようとしました。最初から2つのtkinterウィンドウが表示されるのはなぜですか?

m = Tk() 

def new(a,b): 
    r = Tk() 
    r.geometry(str(a) + "x" + str(b) + "+0+0") 

b = Button(m, text="Click", command=new(100,300)).place(x=0,y=0) 

m.mainloop() 

ボタンでウィンドウを取得する代わりに、ボタンをクリックせずに2つのウィンドウが表示されます。

The two windows.png

私が間違って何をしたのですか?

+0

@BryanOakley'倍原因彼らがそうするべきであるように 'Toplevel'を使用する代わりにダブルウィンドウ。 OPの主な問題は、ボタンプレスで2番目のウィンドウを作成することですが、それは間違っているので、良い答えか、プログラムで 'Tk()'を2回使用することに関連する重複した質問のどちらかで対処する必要があります。 –

+0

「Toplevel」を使用しても、起動時に2つのウィンドウが表示されます。彼らが2つのウィンドウを得る理由は、 'command'と' command() 'の関係によるものです。私は 'Tk()'を二度使用することが問題であることに同意しますが、それは彼らが求めていたものではありません。 –

+0

@BryanOakley Yaコマンドの問題があります。command()この問題の2つの部分の性質は、ここで間違っている箇所の半分に解決策だけをリンクすると、より良い説明に値すると思います。 –

答えて

0

あなたがButtonを構築するとしてあなたがコールバックとしてそれを渡していない、(その戻り値はcommand引数として渡すことができるようnewが実行を終了しなければならないので、技術的には、あなたはButtonを構築)newを呼んでいますクリックで呼び出す

commandとして呼び出すことができます(引数なし)。あなたのnew呼び出しをラップし、それによってlambdaが呼び出されるまで、それを延期することlambdaを使用して:

b = Button(m, text="Click", command=lambda: new(100,300)).place(x=0,y=0) 
0

あなたのボタンの内側には、あなたが新しい関数と呼ばれている呼び出します。その関数はTkの新しいインスタンスを作成しています。このため、2つのウィンドウが開きます。

最初のTkインスタンスでジオメトリ操作を実行すると仮定すると、Tkオブジェクトを新しい関数に渡すだけです。

あなたはそうのようにそれを行うことができます:ボタンの問題は、私はここに大きな問題は `Tkの()を使用してOPだと思う前に、initの実行が求められているコマンドとして

from tkinter import * 

m = Tk() 

def new(a, b, r): 
    r.geometry(str(a) + "x" + str(b) + "+0+0") 

b = Button(m, text="Click", command=new(100, 300, m)).place(x=0, y=0) 

m.mainloop() 
+0

これは実際にOPの質問に役立ちません。彼らは第2のウィンドウを開きたいと思っていて、その関数の内部で 'Toplevel'を使用していなければなりません。また、initで実行されているコマンドの問題を修正していません。 –

+0

あなたは正しいです、私はそれをすべて読まなかったのです。 –

関連する問題