2017-04-21 2 views
1

これは私の最初の質問です。私はPythonとこのサイトには初めてです。Pythonでtkinterを使ってトップレベルウィンドウからメインウィンドウを閉じる

私はデータベースとやりとりするアプリケーションを設計しています。 「閉じる」ボタンを追加して、「プログラムを閉じる」という新しいウィンドウを開きたいと思います。 2つのボタン:はいといいえ。いいえをクリックすると、新しいウィンドウが閉じます。 [はい]をクリックすると、両方のウィンドウが閉じます。

私は自分のコードを動作させましたが、それを行うためのより良い、よりスマートな方法があります。

私は "close_window"メソッドに "root.destroy()"と書く必要がありましたが、 "self.master.destroyのようなもので同じ結果を得るよりスマートな方法があると確信しています) "は、すべてのpythonの力を使います。以下のコードの簡略化されたバージョンを示します。

ありがとうございます。

アルフォンソあなたは単にmessageboxモジュールが提供する標準のダイアログを使用することができ

from tkinter import * 

class Window(): 

    def __init__(self, main): 
     self.main = main 

     self.b5=Button(self.main, text="Action 1", width=12) 
     self.b5.grid(row=0, column=1) 

     self.b5=Button(self.main, text="Action 2", width=12) 
     self.b5.grid(row=0, column=2) 

     self.b6=Button(self.main, text="Close", width=12, command=self.new_window) 
     self.b6.grid(row=0, column=3) 

    def new_window(self): 
     self.newWindow = Toplevel(self.main) 
     self.app = Demo2(self.newWindow) 

    def close_window(self): 
     root.destroy() 


class Demo2: 
    def __init__(self, master): 
     self.master = master 
     self.frame = Frame(self.master) 

     self.l1=Label(self.frame, text="Close the program?") 
     self.l1.grid(row=0, column=0, columnspan=2) 

     self.b1=Button(self.frame, text="Yes", command=self.yes_com) 
     self.b1.grid(row=1, column=0) 

     self.b1=Button(self.frame, text="No", command=self.no_com) 
     self.b1.grid(row=1, column=1) 

     self.frame.pack() 

    def yes_com(self): 
     self.master.destroy() 
     Window.close_window(self) 

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


def main(): 
    global root 
    root = Tk() 
    app = Window(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

答えて

1

具体的には、新しいウィンドウのオープン/クローズの世話をして、ユーザーがNoをクリックした場合、ユーザはYesFalseをクリックした場合Trueを返しaskyesnoダイアログを提供します。ユーザーがself.main.destroy()rootglobalと宣言する必要はありません)を使用するだけで簡単にウィンドウを閉じる場合は、if文を使用して簡単にウィンドウを閉じることができます。

from tkinter import * 
from tkinter import messagebox 

class Window(): 

    def __init__(self, main): 
     self.main = main 

     self.b5=Button(self.main, text="Action 1", width=12) 
     self.b5.grid(row=0, column=1) 

     self.b5=Button(self.main, text="Action 2", width=12) 
     self.b5.grid(row=0, column=2) 

     self.b6=Button(self.main, text="Close", width=12, command=self.close_window) 
     self.b6.grid(row=0, column=3) 

    def close_window(self): 
     if messagebox.askyesno('Close', 'Close the program?'): 
      self.main.destroy() 

def main(): 
    root = Tk() 
    app = Window(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

ノート

  1. 標準のダイアログではい/いいえボタンは、彼らがコンピュータの設定で使用される言語に翻訳されていることを意味し、ををローカライズされていません。
  2. messageboxモジュールの周りを見ると、他の標準ダイアログがあることがわかります。 IMHOはこの場合、同じ方法で使用されるaskyescancelを使用しますが、より意味があるようです。
+0

おかげ桟橋パオロメッセージボックスモジュールはまさに私が必要としていたものです。私が聞いてみると、 'tkinter import *'を使ってtkinterライブラリ全体をインポートしようとしていると、なぜ 'tkinter import messagebox'が必要ですか?あなたの助けをもう一度ありがとう! – Alfonso

+0

@Alfonso: 'from my_package import *'は 'my_module'のすべてをインポートするのではなく、そのパッケージがエクスポートするものだけをインポートするためです。この場合、 'messagebox'は' tkinter'モジュールが明示的にエクスポートしないので自動的にインポートされないので、手動で行う必要があります。より深い説明をするには、[Why import * and ttk?](http://stackoverflow.com/questions/24725920/why-import-and-then-ttk#24728212)を参照してください。その場合、モジュールは 'messagebox'の代わりに' ttk'です。 –

+0

あなたの答えをありがとう! – Alfonso

1

桟橋パオロは、正しい答えを持っていますが、科学のために、ここにあなたの質問に直接答えだ:

def yes_com(self): 
    self.master.master.destroy() # <this class instance>.<toplevel instance>.<Tk instance>.destroy() 

それとも、単にパイソンを終了する可能性:

import sys 

def yes_com(self): 
    sys.exit() 
+0

'sys.exit()'を使っても問題ありません。 'exit()'や 'quit()'だけを使うのはインストールに依存しているので、あなたのコードでは使用しないでください。プレーンバージョンはREPLで使用するためのものです。 – Novel

+0

申し訳ありませんが、私はあなたのコードについて素早く推測しました。編集されました。 – Novel

+0

こんにちはジョナサン、あなたの提案に感謝します。 'sys.exit()'は完璧に動作し、すべてを閉じます。私はここで質問をしていますが、それは 'quit()'や 'exit()'よりもウィンドウを破壊する方が良いと言われました。どう思いますか? 'self.master.main.destroy()'は次のエラーを出しても動作しませんでした: 'self.master.main.destroy()AttributeError: 'Toplevel'オブジェクトの属性がmainです。私は両方のクラスをリンクする方法を理解したいと思います。あなたの助けをもう一度ありがとう! – Alfonso

関連する問題