2017-10-28 80 views
0

我試圖動態地將子幀添加到主框架小部件。子幀是帶有按鈕的列,我爲子幀創建了一個單獨的類,以便將子幀作爲列表中的對象,以便稍後可以對其進行更改。實際上,額外列的數量也取決於用戶輸入。在Tkinter中添加子幀python3

我首先使用網格管理器將小部件添加到主框架,稍後我使用網格將按鈕添加到子框架。我希望網格在不同的幀中使用時會實現,但是它表現爲子幀類中的網格調用直接在主框架內部而不是在子框內部放置部件。

代碼:

import tkinter as tk 

extra_columns = 1 

class App(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 

     container = tk.Frame(self) 
     container.grid(sticky="nsew") 
     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 

     self.frames = {} 
     for F in (MainFrame,): 
      page_name = F.__name__ 
      frame = F(parent=container, controller=self) 
      self.frames[page_name] = frame 
      frame.grid(row=0, column=0, sticky="nsew") 

     self.show_frame("MainFrame") 

    def show_frame(self, page_name): 
     frame = self.frames[page_name] 
     frame.tkraise() 


class MainFrame(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     self.subframes = [] 
     self.init_main() 
     self.init_subframes() 

    def init_main(self): 
     self.title = tk.Label(text='Title') 
     self.title.grid(row=0, column = 2) 
     for i in range(1, 3): 
      b = tk.Button(text=str(i)) 
      b.grid(row=i, column=0) 
      c = tk.Button(text=str(i+10)) 
      c.grid(row=i, column=2+extra_columns+1) 

    def init_subframes(self): 
     for i in range(1, extra_columns+1): 
      m = SubFrame(self) 
      self.subframes.append(m) 
      m.grid(row=1, column=2+i, rowspan=5) 


class SubFrame(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     for i in range(1, 6): 
      b = tk.Button(text="extra"+str(i), command=lambda: print("button \ 
pressed")) 
      b.grid(row=i, column=0) 


root = App() 
root.mainloop() 

爲了記錄:我顯示主框架(App類內)的方式從教程採取pythonprogramming.net,是我真正的代碼也可使用。

謝謝!

+1

你是否知道'Label','Button'等的第一個參數是父窗口或框架,它應該包含標籤或按鈕? –

+1

謝謝,將master = ...添加到我所有的網格任務中解決了我的問題! –

回答

1

Bryan的評論所述,在創建窗口小部件(框架,按鈕,標籤等)對象時,除非明確將框架對象作爲父對象傳遞,否則認爲根窗口是父窗口。

如果你想在一個框架的基礎上管理幾何圖形,你需要指定該框架的父窗口。

檢查下面的代碼:

import tkinter as tk 

#creates a window object named root, this object is the default parent for ever widget object 
root = tk.Tk() 

#creates a frame that is a child of object named 'root' 
mainFrame = tk.Frame(master=root) 

#creates a frame that is a child of 'mainFrame' 
subFrame_mainFrame = tk.Frame(mainFrame) 

#creates a button that is a child of 'subFrame' 
button_subFrame_mainFrame_root = tk.Button(master=subFrame) 

#creates a button that is a child of default, which is 'root' in this case 
button_root = tk.Button() 

#creates a button that is a child of mainFrame 
button_mainFrame = tk.Button(mainFrame) 

可以管理主窗口或任何的框架的內容獨立的幾何形狀,給你正確分配框架的孩子把它當成父。

Here是模塊化管理幾何圖形的一個例子。

+1

感謝您的詳細示例,我將master = self作爲參數添加到每個網格調用中,並且所有的孩子都可以正確對齊! –

+1

@CelThys作爲參考,你實際上不需要說'master =',因爲每個小部件的第一個參數被認爲是小部件的父代或「主」。只要說'Button(parent,text = ........)'就足夠了。 –