2012-04-03 23 views
12

"Good-bye"というラベルの付いたボタンを使用してGUIアプリケーションを作成します。 Buttonをクリックすると、ウィンドウが閉じます。ボタンを押してTkinterウィンドウを閉じる方法は?

これまでのコードですが、動作しません。誰も私のコードで私を助けることができますか?

は、あなたがその command属性に destroy方法を関連付けることによって、あなたのウィンドウを閉じて専門​​れますTkinterの Buttonクラスを拡張するクラスを作成することができ
+4

Hey Matt。明確な質問と、きれいで簡単なコード例をお寄せいただきありがとうございます。また、あなたのコードが "動作していない"ときに、将来的にトレースバック(クラッシュ)を含めることを確認できますか?それはまた、人々がコードのどの部分が壊れているかをほぼ即座に把握するのに役立ちます。明らかにこの場合、コードサンプルは非常に小さく、識別が容易ですが、将来的には困難な状況で回答を得るのに役立つかもしれません。 – jdi

+0

問題がすぐに見えない人は、エラーが 'TypeError:close_window()に1つの必須の位置引数 'root'がありません。これは、コールバック 'close_window'に引数が渡されなかったことを意味します。これは' command = '関数のためのものではありません。バインドされたイベントコールバックは引数(イベントオブジェクト)を取得します。 –

答えて

7

from Tkinter import * 

window = Tk() 

def close_window (root): 
    root.destroy() 

frame = Frame(window) 
frame.pack() 
button = Button (frame, text = "Good-bye.", command = close_window) 
button.pack() 

window.mainloop() 

from tkinter import * 

class quitButton(Button): 
    def __init__(self, parent): 
     Button.__init__(self, parent) 
     self['text'] = 'Good Bye' 
     # Command to close the window (the destory method) 
     self['command'] = parent.destroy 
     self.pack(side=BOTTOM) 

root = Tk() 
quitButton(root) 
mainloop() 

これは、出力は次のようになります。

enter image description here


そして、前にあなたのコードが機能しなかった理由:私はあなたがwindow = tk()をしたので、あなたは、いくつかの他の場所からのルートを得たかもしれないわずかな感覚を持っている

def close_window(): 
    # root.destroy() 
    window.destroy() 

Tkinterのwindowで破棄を呼び出すと、アプリケーションのメインウィンドウがwindow(ルートウィンドウ)であるため、アプリケーション全体が破棄されることを意味します。 IMHO、windowrootに変更する必要があります。あなたのコードに最小限の編集(彼らはあなたのコースでクラスを教えたりないてきたかどうかわからない)、変更により

from tkinter import * 

def close_window(): 
    root.destroy() # destroying the main window 

root = Tk() 
frame = Frame(root) 
frame.pack() 

button = Button(frame) 
button['text'] ="Good-bye." 
button['command'] = close_window 
button.pack() 

mainloop() 
20

def close_window(root): 
    root.destroy() 

def close_window(): 
    window.destroy() 

に、それが動作するはずです。


説明:close_windowのバージョンが単一の引数、つまりrootを期待するように定義されて

。その後、あなたのバージョンclose_windowへの呼び出しはその引数を持つ必要があります。そうしないと、Pythonはという実行時エラーを返します。

Buttonを作成したときに、クリックしたときにclose_windowを実行するようにボタンに指示しました。ただし、ボタンのウィジェットのソースコードのようなものです:私のコードの状態として

# class constructor 
def __init__(self, some_args, command, more_args): 
    #... 
    self.command = command 
    #... 

# this method is called when the user clicks the button 
def clicked(self): 
    #... 
    self.command() # Button calls your function with no arguments. 
    #... 

Buttonクラスは、引数なしで、あなたの関数を呼び出します。しかし、あなたの関数は引数を期待しています。したがって、あなたはエラーが発生しました。関数呼び出しは、Buttonクラスの内部で実行されるように、我々は、その引数を取るのであれば、我々はと残されている:

def close_window(): 
    root.destroy() 

rootに値が割り当てられることはありませんので、どちらかの、しかし、権利はないこと。xをまだ定義していない場合は、print(x)と入力してください。

はあなたのコードを見てみると、私はあなたがwindowdestroyを呼び出すしたい考え出したので、私はwindowrootを変更しました。

1

あなたはclose_window関数の引数としてwindowオブジェクトへの参照を渡すためにlambdaを使用することができます。

button = Button (frame, text="Good-bye.", command = lambda: close_window(window)) 

command属性は呼び出し可能な、またはオブジェクトのような呼び出し可能に期待しているので、これは動作します。 lambdaは呼び出し可能ですが、この場合、基本的には、設定されたパラメータで特定の関数を呼び出した結果になります。

本質的に、関数自体ではなく、argsを持たない関数のラムダラッパーを呼び出すことになります。

6

あなたbuttoncommand属性に直接関数オブジェクトwindow.destroyを関連付けることができます。

button = Button (frame, text="Good-bye.", command=window.destroy) 

この方法で、あなたはあなたのためにウィンドウを閉じるには、機能close_windowを必要としません。

-1
from tkinter import * 

def close_window(): 
    import sys 
    sys.exit() 

root = Tk() 

frame = Frame (root) 
frame.pack() 

button = Button (frame, text="Good-bye", command=close_window) 
button.pack() 

mainloop() 
関連する問題