2016-07-14 291 views
1

我是一個Python初學者做是應該保存和保留目前的campingsite(只是爲了好玩......)的程序。我以OOP方式構建它,這意味着我爲每個單獨的窗口定義一個類。我需要做的是更新一個顯示數據庫條目的TopLevel窗口(SubWindow2),當另一個TopLevel窗口(從Subwindow2創建)關閉時。Tkinter:先關閉另一個TopLevel窗口時更新TopLevel窗口? (參考?)

import Tkinter as tk 

class MenuWindow(tk.Tk): 
    def __init__(self, master): 
     self.master = master 

     #Widgets 

    def open_subwindow1(self): 
     self.window = Toplevel(self.master) 
     self.SubSubWindow1 = SubSubWindow1(self.window) 

    def open_subwindow2(self): 
     self.window = Toplevel(self.master) 
     self.SubSubWindow2 = SubSubWindow2(self.window) 

class SubWindow1(tk.Tk): 
    def __init__(self, master): 
     self.master = master 

     #Widgets 

class Subwindow2(tk.TopLevel): 
    def __init__(self, master): 
     self.master = master 

     #Widgets 

     self.button = tk.Button(master, text='Quit', command=open_subsub1) 

    def load_values(self): 
     #loading sqlite db-values into listboxes 

    def open_subsub1(self): 
     self.window = Toplevel(self.master) 
     self.SubSubWindow1 = SubSubWindow1(self.window) 

class SubSubWindow1(tk.TopLevel): 
    def __init__(self, master): 
     self.master = master 

     #Widgets 

     self.button = tk.Button(master, text='Quit', command=on_quit) 

    def on_quit(self): 
     #Here I want to call a function that updates SubWindow2 (loads sqlite database values into several listboxes) 

     self.master.destroy() 

root = tk.Tk() 
myprog = MyProg(root) 

root.mainloop() 

如何從SubSubWindow1訪問Subwindow2中的函數? self.master只是指TopLevel()實例吧?

def on_quit(self): 
    self.SubWindow2.load_values() 
    self.master.destroy() 

不工作,我得到一個TypeError: unbound method load_values() must be called with SubWindow2 instance as first argument (got nothing instead)

這是一個unvalid計算策略,以「嵌套」的頂層窗口?有什麼選擇?

的任何言論都大大appriciated!感謝您的幫助

回答

0

我應該聲稱我也是新手前言本,而爲了不傳播誤傳我將不勝感激別人的建議。

從我所看到的,你有一些誤解與繼承與封裝如何在Python工作。首先,在Tkinter應用程序中,應該只有一個Tk()的實例。在您的類定義,你聲明...

class SubWindow1(tk.Tk): 

這意味着,當你創建一個新的SubWindow1,傳統知識的新實例將成爲它實例化,SubWindow1將繼承其所有屬性。

如果你想創建一個指向,並擁有所有的屬性設定一個Toplevel實例,一類,你Subwindow2是正確的。

class Subwindow2(tk.TopLevel): 

然而,INIT內,還必須初始化的Toplevel的此實例爲這樣:

class SubWindow2(tk.Toplevel): 
    def __init__(self, master): 
     tk.Toplevel.__init__(self) 
     self.master = master 

每個 '主' 是指它上面的元件。 Tk應用程序作爲樹形層次結構工作。這就是爲什麼你應該只有一個Tk()的實例,它作爲你的「根」。 Tk的這個實例包含其中的窗口,其中包含窗口或其中的元素。所以每個窗口或元素都會有一個父母,稱爲主人,所以你將能夠瀏覽。

所以,當你創建SubWindow2的一個實例,這是指一切你SubWindow2內,與包括在Toplevel的實例都一起。因爲「自我」現指的Toplevel,你可以將它傳遞到孩子們是高手,因爲這樣的:

self.sub_sub_window1 = SubSubWindow1(self) 

self.master僅指頂層()的實例吧?

是的,但因爲你將繼承所有頂層的通過你的SubWindow2繼承屬性,你可以添加更多的方法,並通過您self.master標籤仍然提到他們。

最後,您還應該在您希望在窗口上正確顯示的元素上調用pack()。

總而言之,我對程序做了一些編輯,試圖展示一些繼承的概念以及它在Tkinter應用程序中的工作原理。我希望你可以看看這個,並從中獲得一些東西。請讓我知道是否有任何元素你不同意,因爲它遠不是完美的。

import Tkinter as tk 

class MenuWindow(): 
    def __init__(self, master): 
     self.master = master 
     self.sub_window_1 = SubWindow1(self.master) 
     self.sub_window_2 = SubWindow2(self.master) 

class SubWindow1(tk.Toplevel): 
    def __init__(self, master): 
     tk.Toplevel.__init__(self) 
     self.master = master 

class SubWindow2(tk.Toplevel): 
    def __init__(self, master): 
     tk.Toplevel.__init__(self) 
     self.master = master 
     self.sub_sub_window1 = SubSubWindow1(self) 

    def print_hello(self): 
     print "Hello!" 

class SubSubWindow1(tk.Toplevel): 
    def __init__(self, master): 
     tk.Toplevel.__init__(self) 
     self.master = master 
     self.button = tk.Button(self.master, text='Say Hello & Destroy', command=self.on_quit) 
     self.button.pack() 

    def on_quit(self): 
     self.master.print_hello() 
     self.master.destroy() 

root = tk.Tk() 
myprog = MenuWindow(root) 
root.mainloop() 
+0

哇這個作品偉大的trank你!儘管我必須使用「self」作爲我的小部件(即幀)的父項,才能使它們顯示在頂部窗口而不是根窗口中!感謝您的幫助和努力 –