2015-08-28 39 views
-1

我有一個tkinter應用程序,我已經創建了類。使用Tkinter的另一個類的功能

第一個是class MainWindow(),其中主窗口正在繪製。 另一個是class SettingsWindow(),其中選項窗口正在繪製。

我要用class2中的class1使用on_exit方法。如何正確使用它?

還有一件事,如何正確創建SettingsWindow?我在下面拋出錯誤的方式,這表明我錯過了論點。

mainWindow = MainWindow() TypeError: init() missing 1 required positional argument: 'master'

代碼:

class MainWindow(): 

    def __init__(self, master): 

     self.master = master 

     ... 
     some widgets 
     ... 

    # Trying to create SettingsWindow object 
    def open_settings(self): 
     settingsWindowsToplevel = Toplevel() 
     settingsWindow = SettingsWindow(self, MainWindow) 

    # The function i'm gonna use in another class 
    def on_exit(self): 

     self.master.exit_button() 

class SettingsWindow(): 

    def __init__(self, parent, master): 

     self.master = master 

     ... 
     some widgets again 
     ... 

# Creating main window 
def main(): 
    root = Tk() 
    mainWindow = MainWindow(root) 
    root.mainloop() 

if __name__ == "__main__": 
    main() 

有很多功能,我需要從另一個類推出,我可以不知道該怎麼做正確的方式與tkinter

謝謝。

+0

'SettingsWindow'可能有這將是'MainWindow'和父屬性主屬性這將是你已經定義的。 – Hugo

+0

@ Hugo嘗試鍵入'class SettingsWindow(MainWindow)',但是在這種情況下,'def __init__'不起作用,告訴我我錯過了調用超類。請問,你可以用你的解釋向GitHub做一個提交或問題嗎?謝謝。 – Senpos

+0

繼承是絕對不*解決方案。 –

回答

0

這不是你正在尋找的解決方案,但我認爲這是很好的考慮。一切都在一個Tk類中實現,在這種情況下,總是隻有一個窗口。但是,如果有人知道繼承,我也希望看到解決方案。

from tkinter import * 
from tkinter import ttk 


class MainWindow(): 

    def __init__(self, mainWidget): 
     self.main_frame = ttk.Frame(mainWidget, width=300, height=150, padding=(0, 0, 0, 0)) 
     self.main_frame.grid(row=0, column=0) 

     self.some_kind_of_controler = 0 

     self.main_gui() 

    def main_gui(self): 
     root.title('My Window') 

     self.main_label_1 = ttk.Label(self.main_frame, text='Object_1') 
     self.main_label_1.grid(row=0, column=0) 

     self.main_label_2 = ttk.Label(self.main_frame, text='Object_2') 
     self.main_label_2.grid(row=1, column=0) 

     self.main_label_3 = ttk.Label(self.main_frame, text='Object_3') 
     self.main_label_3.grid(row=2, column=0) 

     self.setings_button = ttk.Button(self.main_frame, text='Setings') 
     self.setings_button.grid(row=0, column=1) 
     self.setings_button.bind('<Button-1>', self.setings_gui) 

     self.gui_elements = [self.main_label_1, 
          self.main_label_2, 
          self.main_label_3, 
          self.setings_button] 

    def setings_gui(self, event): 
     self.gui_elements_remove(self.gui_elements) 

     root.title('Setings') 

     self.main_label_1 = ttk.Label(self.main_frame, text='Object_1') 
     self.main_label_1.grid(row=2, column=0) 

     self.main_menu_button = ttk.Button(self.main_frame, text='Main menu') 
     self.main_menu_button.grid(row=0, column=1) 
     self.main_menu_button.bind('<Button-1>', self.back_to_main) 

     self.some_kind_of_controler = 1 

     self.gui_elements = [self.main_label_1, 
          self.main_menu_button] 

    def back_to_main(self, event): 
     if self.some_kind_of_controler == 1: 
      self.gui_elements_remove(self.gui_elements) 
     else: 
      pass 
     self.main_gui() 

    def gui_elements_remove(self, elements): 
     for element in elements: 
      element.destroy() 

def main(): 
    global root 

    root = Tk() 
    root.geometry('300x150+50+50') 
    window = MainWindow(root) 

    root.mainloop() 

if __name__ == '__main__': 
    main() 
+0

將嘗試,謝謝。 – Senpos

0

正常的方式做,這是你的主窗口的引用傳遞到你的設置窗口:

class SettingsWindow(): 
    def __init__(self, parent, master): 
     self.master = master 
     ... 
    def on_exit(self): 
     self.master.exit_button() 

mainWindow = MainWindow(...) 
... 
settingsWindow = SettingsWindow(..., mainWindow) 
+0

謝謝。但是,我需要初始化settingsWindow對象嗎?它應該打開時,我按「設置」按鈕。在這種情況下,我創建'def open_settings(self)settingsWindow = SettingsWindow(MainWindow)'它不起作用。要使用代碼更新第一條消息以使其更具可讀性。 – Senpos

+0

@Senpos:在初始化主窗口後隨時初始化它。 –

相關問題