【问题标题】:Adding subframes in Tkinter python3在 Tkinter python3 中添加子帧
【发布时间】: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 上的教程,并且也用于我的真实代码中。

谢谢!

【问题讨论】:

  • 您知道LabelButton 等的第一个参数是应该包含标签或按钮的父窗口或框架吗?
  • 谢谢,将 master=... 添加到我的所有网格分配解决了我的问题!

标签: python python-3.x oop tkinter


【解决方案1】:

正如Bryan's comment 中提到的,在创建小部件(框架、按钮、标签等)对象时,除非将框架对象明确作为父级传递,否则根窗口被假定为父级。

如果您想在框架基础上管理几何图形,您需要将小部件的父级分配为该框架。

检查下面的代码:

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 是关于模块化管理几何的示例。

【讨论】:

  • 感谢您提供详细示例,我将 master=self 作为参数添加到每个网格调用中,并且所有子项都正确对齐!
  • @CelThys 作为参考,您实际上不需要说master=,因为每个小部件的第一个参数都被假定为小部件的父级或“主控”。光说Button(parent, text=........)就够了。
猜你喜欢
  • 1970-01-01
  • 2021-03-11
  • 2020-05-02
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多