【发布时间】:2017-10-28 17:21:23
【问题描述】:
我正在尝试将子帧动态添加到主 Frame 小部件。子框架是其中带有按钮的列,我为子框架创建了一个单独的类,以便将子框架作为列表中的对象,以便我以后可以更改它们。实际上,额外列的数量还取决于用户输入。
我首先使用网格管理器将小部件添加到主框架,后来我使用网格将按钮添加到子框架。我希望网格在不同框架中使用时能够实现,但似乎子框架类中的网格调用将小部件直接放置在主框架内,而不是仅在子框架内。
代码:
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 上的教程,并且也用于我的真实代码中。
谢谢!
【问题讨论】:
-
您知道
Label、Button等的第一个参数是应该包含标签或按钮的父窗口或框架吗? -
谢谢,将 master=... 添加到我的所有网格分配解决了我的问题!
标签: python python-3.x oop tkinter