2017-10-08 6 views
0

私はいくつかの基本的な計算を行うためにtkinterでGUIを作っています。私の問題は、私はいくつかのダイアログを閉じることができないということです。私はそれらを閉じて、ユーザーの選択を取ることによって視覚化を変更したいと思います。私のコードは、ウィンドウを閉じるまで待たずにメインクラスの終わりまで待っています。私はそれを解決するために助けが必要です。Pythonを閉じる複数のダイアログをTkinter

class Plotia(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, *kwargs) 
     tk.Tk.wm_title(self, "Plotia") 
     s = ttk.Style() 
     s.theme_use("clam") 

     # Configuration of the window .... 
     #.... 
     #.... 
     #.... 
     ## Initial Values ############################## 

     self.Number_Graph = 1 
     self.path_file = [None for i in range(self.Number_Graph)] # Number of files 
     self.columnData = [4 for i in range(self.Number_Graph)] # Number of column of the data 
     self.column_x = [0 for i in range(self.Number_Graph)] 
     self.column_y = [0 for i in range(self.Number_Graph)] 


    def askData(self): 
     # I don't understand why ChoiceData don't close. 

     self.graph = ChoiceData(self.Number_Graph, self.columnData) 
     # Only when the main window close, this two lines executes, 
     # and change this two variables. I want that this two lines executes when 
     #Choice Data close 
     self.column_x[self.graph.selection] = self.graph.data[0] 
     self.column_y[self.graph.selection] = self.graph.data[1] 







# This is is the Dialog I can close correctly 


class ChoiceData(tk.Toplevel): 

    def __init__(self, NumberGraph, NumberData): 
     super(ChoiceData, self).__init__() 


     ## Initial Values ################################# 

     self.NumberGraph = NumberGraph 
     self.selection = None 
     self.numberData = NumberData 
     self.data = [] 

     ######################################################## 

     # Layout Configure 
     #... 


    def Select(self): 
     self.selection = int(self.BoxList.get())-1 
     selectionData = SelectData(self.numberData[self.selection]) 
     self.data.append(selectionData.xData) 
     self.data.append(selectionData.yData) 
     self.destroy() 



class SelectData(tk.Toplevel): 

    def __init__(self, numberData): 
     super(SelectData, self).__init__() 



     ## Initial Values ################################# 

     self.xData= None 
     self.yData = None 
     self.NumberData = numberData 

     ######################################################## 

     # Layout configuration.,,, 

    def Update(self): 
     self.xData = int(self.xBox.get())-1 
     self.yData = int(self.yBox.get())-1 
     self.destroy() 


if __name__ == '__main__': 
    app = Plotia() 
    app.geometry("500x500") 
    app.mainloop() 

EDIT:Tkinterのインポートから *

class Quit: 
    def __init__(self, root): 
     root.destroy() 


class ChoiceData: 
    def __init__(self,root): 
     self.top = Toplevel(root) 
     self.label = Label(self.top, text="ChoiceData") 
     self.button = Button(self.top, text="Ok", command=self.stuff) 
     self.top.protocol("WM_DELETE_WINDOW", lambda: Quit(self.top)) 
     self.label.pack() 
     self.button.pack() 

    def stuff(self): 
     thing = SelectData(self.top) 
     self.top.destroy() 
     print("Windows closed") 




class SelectData: 
    def __init__(self,root): 
     self.top = Toplevel(root) 
     self.label = Label(self.top, text="SelectData") 
     self.button = Button(self.top, text="Ok", command=self.closer) 
     self.top.protocol("WM_DELETE_WINDOW", lambda: Quit(self.top)) 
     self.label.pack() 
     self.button.pack() 
     self.top.mainloop() 
    def closer(self): 
     self.top.destroy() 




root = Tk() 
ChoiceData(root) 
root.mainloop() 

これは私が何をしたいの簡体版です。選択データが閉じると、選択されたデータは開いたままです。

+1

外部サイトのコードを共有しないでください。 [MCVE]を読んだら、ここに貼り付けてください。 – Lafexlos

+0

「できない」とは何ですか?なぜあなたはできないのですか?試してみるとどうなりますか? –

+0

OKボタンを押すとデータ選択ダイアログが閉じますが、データ選択ダイアログは開いたままです。 。 self.column_x [self.graph.selection] = self.graph.data [0]; self.column_y [self.graph.selection] = self.graph.data [1]この行は、Choice Dataを手動で閉じてもメインウィンドウ(Plotia)を閉じるまで実行されません。 Select Dataを閉じるとChoiceDataを自動的に閉じて、その2行を実行します。 – samuel

答えて

0

Toplevelウィジェットでアクションを実行して、Toplevelウィジェットを閉じてコードスニペットを実行すると、以下のような結果が得られます。

from tkinter import * 

class App: 
    def __init__(self, root): 
     self.root = App.root = root 
     ChoiceData() 
     SelectData() 
    def close(): 
     ChoiceData.top.destroy() 
     SelectData.top.destroy() 
     print("Windows closed") 

class ChoiceData: 
    def __init__(self): 
     self.top = ChoiceData.top = Toplevel(App.root) 
     self.label = Label(self.top, text="ChoiceData") 
     self.button = Button(self.top, text="Ok", command=App.close) 
     self.top.protocol("WM_DELETE_WINDOW", App.close) 
     self.label.pack() 
     self.button.pack() 

class SelectData: 
    def __init__(self): 
     self.top = SelectData.top = Toplevel(App.root) 
     self.label = Label(self.top, text="SelectData") 
     self.button = Button(self.top, text="Ok", command=App.close) 
     self.top.protocol("WM_DELETE_WINDOW", App.close) 
     self.label.pack() 
     self.button.pack() 

root = Tk() 
App(root) 
root.mainloop() 

ここでは、App.close()機能を実行させる4つのトリガーがあります。

最初の2

は、両方のウィンドウを閉じて、我々はスニペットの挿入何でも実行している、我々は両方がこの機能を実行します App.closeに設定し、その command属性を持つ各 Toplevelの内側に作成 Buttonウィジェットです。

もう1つはもう少し面白いですが、少し赤い "X"が押さ​​れたときにウィンドウの終了を処理するWM_DELETE_WINDOWイベントを上書きし、代わりにApp.close()を実行して両方のウィンドウとスニペットを実行します。

+0

AppクラスはTopLevelウィンドウを閉じますが、これは私の問題ではありません。 Choiceデータは、メインクラスのMenuオブジェクトを使用して開いています。このMenuオブジェクトは、Choice Dataを開く関数(askData)に接続されています。選択データを開く選択データを閉じる、選択データを閉じるべきであるが、そうでないときに、ボタン割り当てを使用してデータを選択する。 – samuel

+0

あなたのコード@Ethanフィールドの簡単な変更で私の質問を編集します。この変更は自分のGUIで私の問題を示しています.Choice Dataは、self.top.destroyを使って閉じても開いています。 – samuel

+0

@サミュエル私はあなたが望むものを理解していない、あなたはそれを閉じるにしてもChoice Dataを開いたままにしておきたいですか?それを閉じるには、いつどのような条件で閉じるべきですか? –

0

は最後に、私は最後の行には、私が使用する必要があり、私のGUI上の不良だったものが見つかりました:

self.quit() 

の代わり:

self.destroy() 

self.destroy()せてはいけませんSelect Dataのメインループの後にプログラムを続行します。 そして、私を助けてくれた@Ethan Fieldに感謝します。

関連する問題