1

こんにちは、Pythonで複数のtkinterウィンドウを使用するのに苦労しています。基本的に、2つの異なるウィンドウに関連する2つのクラスがあります。メインクラスはメインウィンドウ(parentWindow)を示し、他のクラスはsecondWindow(childWindow)を示します。次のコードはメインウィンドウを起動します。

#START THE APPLICATION
root = Tkinter.Tk()
root.title ("GEMEINDESTECKBRIEF-Menü")
# My main Application
runGUI = MainWorkspaceConfig (root)
root.mainloop ()

これまでのところ問題はありません!

ここで、メインクラスの関数を呼び出す2番目のウィンドウを開こうとしています(ウィンドウを開くためのonClickFunctionの一種)

def opendirFactsheetHochwasserGebaeude (self) :
    #validates the workspace resp. database directory and
    #print self.checkFactsheet2.get()
    #print self.inputSpace1.get()

    try:
        if self.checkFactsheet2.get()==1 :

            if self.inputSpace1.get() or self.inputSpace2.get() != "":
                 #write workspace environment to __initFile__
                if self.inputSpace1.get() != "":
                    self.writeWorkspEnv(self.inputSpace1.get())
                    #Copy file in seperate thread
                    start_new_thread(self.copyDefaultFactoWorkspace,())
                if self.inputSpace2.get() != "":
                    self.writeWorkspEnv(self.inputSpace2.get())
                # !!!!!!! START SECOND WINDOW !!!!!
                facthwgeb = Tkinter.Tk()
                facthwgeb.title ("Factsheet Hochwasser-Gebäude")
                runGUI = Factsheet_hochwassergebaeude (facthwgeb)
                facthwgeb.mainloop ()
                #facthwgeb.protocol('WM_DELETE_WINDOW', runGUI.closeFactsheetHochwGeb)
            else:
            #self.inputSpace1.get() and self.inputSpace2.get () =="":
                tkMessageBox.showwarning ("Keine Arbeitsumgebung festgelegt", "Bitte entweder einen neuen Workspace anlegen oder eine bestehende Datenbank auswählen!")
                self.selectBox1.deselect()

それでもすべてがうまく機能します!! ウィンドウが期待どおりに開き、GUIウィジェットも表示されて使用可能になります。与えられたタスクを完了した後、ウィンドウを閉じる必要があり、ここですべてのトラブルが始まります!!! ウィンドウを終了するには、次のようなコマンド関数を備えたボタンを使用しています。

   def closeFactsheetHochwGeb (self):

    try:
        if self.inputSpace1.get() and self.inputSpace2.get() != "":

            with open('%s/__initFile__.txt'%os.path.dirname(os.path.realpath(__file__)), 'r') as file:
                    # read a list of lines into data
                    data = file.readlines()
                    data[13] = self.inputSpace1.get()+"\n"
                    data[14] = self.inputSpace2.get()+"\n"
                    # and write everything back
            with open('%s/__initFile__.txt'%os.path.dirname(os.path.realpath(__file__)), 'w') as file:
                    file.writelines( data )
                    file.close()
            # self.tkinterFrame.destroy()
            self.tkinterFrame.quit()

self.tkinterFrame.quit()は、secondWindow(childWindow)だけでなく、MainWindow(parentWindow)も閉じます。self.tkinterFrame.destroy ()関数はウィンドウからすべてのウィジェットをクリアしますが、ウィンドウはまだアクティブで表示されています!!

それで、問題を解決する方法について何かアイデアはありますか?どんな解決策にも感謝します!!!!!

4

3 に答える 3

7

Tk()2番目のインスタンスを作成しないでください。ルートは1つだけにすることができます。

代わりにトップレベルウィジェットを使用してくださいfacthwgeb。また、facthwgeb.mainloop()呼び出しを削除します。これも、これに対する呼び出しは1つだけである必要があります。

于 2013-03-19T10:28:04.533 に答える
0

YEESSS、ついに私は自分の問題の解決策を見つけました!!!!

最初のステップ: ChildWindowを開始するメインクラスで、関数のコードをからdef opendirFactsheetHochwasserGebaeude (self) := >に変更しました。親はルートウィンドウを参照します。Tkinter typを変更した後、MainWindow(親)によって提供されるため、これもクリアされましたTkinter.Tk()Tkinter.Toplevel(parent)facthwgeb.mainloop()

2番目のステップ: ChildWindowを実装する2番目のクラスでは、関数はフレームのウィジェットをクリアdef closeFactsheetHochwGeb (self):するコマンドself.tkinterFrame.destroy()を所有していましたが、ウィンドウ自体はクリアせずself.tkinterFrame.quit()、MainWindowとChildWindow =>を閉じるため、両方のコマンドは役に立ちません!!

最終ステップ:self.tkinterFrame.destroy ()最終的な解決策は、をself.tkinterFrame.master.destroy()!!に変更することです。

複雑なことは非常に単純な場合があります!! :-)

于 2013-03-22T09:37:39.630 に答える
0

これを試してみてくださいself.Frame1.destroy() またはあなたのフレーム名が多分何でもあなたは時々これを持つことができます self.Frame1 = tk.Frame(top)

于 2019-09-30T18:13:46.913 に答える