2017-03-31 18 views
0

私はtkinterとそれをフルスクリーンにする必要があるという考えを学ぼうとしています。しかし、フルスクリーンにする前に、エスケープを使ってウィンドウを閉じることができるかどうかを確認したかったのです。だから、Stack Overflowのこのような他の質問を通して、私はエスケープするとtkinterのウィンドウを破壊しようとしています。私が持っているTkinterエスケープ・バインディングが破壊されない

`Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Users\Jake\AppData\Local\Programs\Python\Python36- 
32\lib\tkinter\__init__.py", line 1699, in __call__ 
    return self.func(*args) 
TypeError: destroy() takes 1 positional argument but 2 were given` 

私はまったくの引数を呼び出していないと思うので、これは私のために混乱しておろか2:私にはそれが動作するはずのようにこれはそうですが、私は脱出打ったとき、私は例外を取得しています私が作ったcloseメソッドを呼び出す終了ボタンを追加しましたが、エスケープを使用しても動作しません。分かりやすくするために私のコードを提供しました。私はこれがここの多くの質問に似ていることを知っていますが、私はすべてを試して何も私のために働いているようです。前もって感謝します!

import tkinter 
from tkinter import * 

class Window(Frame): 
    def __init__(self, master = None): 
     Frame.__init__(self, master) 

     master.bind('<Escape>', master.destroy) 

     self.init_window() 
    def init_window(self): 
     self.pack(fill=BOTH, expand=1) 
     quitButton = Button(self, text="quit", command=self.close) 
     quitButton.place(x=0, y=0) 

    def close(self): 
     self.master.destroy() 

def main(): 
    root = Tk() 
    root.geometry('500x500') 
    app = Window(root) 
    root.mainloop() 

main() 

答えて

3

イベントに関数をバインドすると、tkinterは常にその関数にイベントオブジェクトを渡します。 destroy関数は引数をとりません。つまり、直接バインドすることはできません。イベントオブジェクトを引数として受け入れる関数にバインドする必要があります。すでに機能を持っているので、あなたは、引数なしであなたの関数を呼び出すために続けることができるように

は、あなたはそれをオプションの名前付き引数を与えることができますが、それはまた、結合に使用することができます。

class Window(Frame): 
    def __init__(self, master = None): 
     ... 
     master.bind('<Escape>', self.close) 

    def close(self, event=None): 
     self.master.destroy() 

ます

master.bind('<Escape>', lambda event: master.destroy()) 
+0

OPにはすでに「close」メソッドがあります。なぜあなたはそれを使わないのですか? – Novel

+0

@Jonathan:そうです。私は私の答えを変えます。 –

+0

OH!イベントオブジェクトも渡されていることはわかりませんでした。どうもありがとう! –

関連する問題