2016-01-04 35 views
-1

我試圖使用類,這一點我是很新,做一個Tkinter的GUI(我看望了TNB的教程就可以了),和我有一些將特性實現到我的代碼並理解它的問題。我試圖去適應的代碼,我在此網站上發現獲得基本的結構,我無法弄清楚如何/爲什麼它的一些工作以及如何添加一些東西的Python 3.4 Tkinter的,理解的代碼/設置窗口大小

這是我到目前爲止的代碼:

import tkinter as tk 


class Application(tk.Tk): # Inheriting tkinter classes etc. 

    def __init__(self): 
     tk.Tk.__init__(self) # Creates window? 
     container = tk.Frame(self) # Creates frame object 
     container.pack(side="top", fill="both", expand=True) # Places container/frame inside window 
     container.grid_rowconfigure(0, weight=1) # ? 
     container.grid_columnconfigure(0, weight=1) # ? 

     self.frames = {} # What does this do? 
     for F in (MenuPage, StartPage, InfoPage, SettingsPage): 
      page_name = F.__name__ # What is __name__ for? 
      frame = F(container, self) 
      self.frames[page_name] = frame # Creating dictionary entries? 
      frame.grid(row=0, column=0, sticky="NSEW") 
     self.show_frame("MenuPage") # Pushes menu page to top when initialised 

    def show_frame(self, page_name): 
     frame = self.frames[page_name] 
     frame.tkraise() # Raises frame to top of stack 


class MenuPage(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     label = tk.Label(self, text="This is the menu page") 
     label.pack(side="top", fill="x", pady=10) 

     # Begins quiz 
     start_btn = tk.Button(self, 
           text="Start", 
           command=lambda : controller.show_frame("StartPage")) 
     start_btn.pack() 

     # Takes user to information page 
     info_btn = tk.Button(self, 
          text="Information", 
          command=lambda: controller.show_frame("InfoPage")) 
     info_btn.pack() 

     # Takes user to settings page 
     settings_btn = tk.Button(self, 
           text="Settings", 
           command=lambda: controller.show_frame("SettingsPage")) 
     settings_btn.pack() 

     # Quits program/closes all GUIs 
     quit_btn = tk.Button(self, 
          text="Quit", 
          command=self.controller.destroy) 
     quit_btn.pack() 


# First page of quiz, will need to inherit from settings? 
class StartPage(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     label = tk.Label(self, text="This is the start") 
     label.pack(side="top", fill="x", pady=10) 


class InfoPage(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     label = tk.Label(self, text="This is the info page") 
     label.pack(side="top", fill="x", pady=10) 

     # Takes user back to main menu 
     menu_btn = tk.Button(self, 
          text="Go to the menu page", 
          command=lambda: controller.show_frame("MenuPage")) 
     menu_btn.pack() 


class SettingsPage(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     label = tk.Label(self, text="This is the settings page") 
     label.pack(side="top", fill="x", pady=10) 

     # Takes user back to main menu 
     menu_btn = tk.Button(self, 
          text="Go to the menu page", 
          command=lambda: controller.show_frame("MenuPage")) 
     menu_btn.pack() 

if __name__ == "__main__": # What does this do? 
    app = Application() 
    app.mainloop() 

(我想在功能上添加了退出按鈕,它實際上是關閉整個GUI程序。到目前爲止,我已經嘗試使用.destroy()作爲按鈕命令,只是quit命令的各種方法,但我沒有運氣,我也嘗試過在Application()類中使用destroy函數,並從命令中調用它,但那也不起作用。我不確定我是否正確使用它) - 修正了,感謝Bryan Oakley和furas。

另一件事我不知道如何做的是改變窗口的大小參數,讓每一個窗口是說(500x200)。當不使用類時這很容易,但我甚至不知道從何時開始使用它們,並且有多個框架。

我也標記/標記了一些代碼行,如果有人能向我解釋它會很好。在解釋原始代碼的某些部分之前,已經有了一篇文章,但他們只討論了該用戶請求的特定部分。

感謝提前:) (希望能全部縮進已複製現在)

+0

行類似於'變量=小工具()。pack()的'將分配'None'到'variable'(未'Widget'),因爲'pack()的/網格()/位()''返回None' 。使用'variable = Widget()'和'variable.pack()' – furas

+0

'command = controller.destroy' – furas

+0

這可能解釋了我在其他代碼片段上遇到的一些錯誤,儘管它們在這裏運行得很好。我會改變,謝謝。 –

回答

1

該代碼被設計,使得主節目(「控制器」)是用於控制圖形用戶界面的中心點。這就是爲什麼self(應用程序本身)作爲controller參數傳遞給其他幀的原因。

因此,調用控制器上的任何功能,從你打電話self.controller.destroy()其他頁面。爲了與退出鍵關聯,你會做這樣的:

quit_btn = tk.Button(self, text="Quit", command=self.controller.destroy) 
quit_btn.pack() 

注:這是一個非常不好的習慣創建插件打下出來 - 調用packgridplace - 在一條語句。您應該始終將小部件的創建與安排在屏幕上分開。當你用一個語句來完成時,你的變量將始終設置爲None,這是無用的。

+0

謝謝你完美的作品!我試圖: quit_btn = tk.Button(self,text =「Quit」,command = self.destroy) –

相關問題