【问题标题】:Resizing frames in main window to fit the window调整主窗口中的框架大小以适应窗口
【发布时间】:2020-09-24 22:01:38
【问题描述】:

我在左侧有菜单框架,在右侧有主容器,但是当我启动它时,我只能在主窗口内的一个小框中看到它们。

无论大小如何,如何使框架适合窗口?

代码:

class GUI(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.title("GUI Project")
        # self.resizable(0, 0)
        menu = tk.Frame(self, relief="solid")
        container = tk.Frame(self, relief="ridge")
        menu.grid(row=0, column=0, rowspan=4, sticky="nsew")
        container.grid(row=0, column=1, sticky="nsew")
        menu.grid_rowconfigure(0, weight=1)
        container.rowconfigure(0, weight=0)
        container.columnconfigure(1, weight=0)

        self.frames = ["Menu", "FutureFeature2", "TestPing", "FutureFeature3", "FutureFeature"]

        self.frames[0] = Menu(parent=menu, controller=self)
        self.frames[1] = FutureFeature2(parent=container, controller=self)
        self.frames[2] = TestPing(parent=container, controller=self)
        self.frames[3] = FutureFeature3(parent=container, controller=self)
        self.frames[4] = FutureFeature(parent=container, controller=self)

        self.frames[0].grid(row=0, column=0, sticky="nsew")
        self.frames[1].grid(row=0, column=0, sticky="nsew")
        self.frames[2].grid(row=0, column=0, sticky="nsew")
        self.frames[3].grid(row=0, column=0, sticky="nsew")
        self.frames[4].grid(row=0, column=0, sticky="nsew")

        self.show_frame(1)

    def show_frame(self, page_name):
        frame = self.frames[page_name]
        print(frame)
        frame.tkraise()
        frame.grid(row=0, column=0, columnspan=5, rowspan=5, sticky="nsew")

class Menu(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller

        button1 = tk.Button(self, text="Ping Test", bg="royalblue2",
                            command=lambda: controller.show_frame(2))
        button2 = tk.Button(self, text="FutureFeature", bg="dark violet",
                            command=lambda: controller.show_frame(4))
        buttun3 = tk.Button(self, text="FutureFeature", bg="pale goldenrod",
                            command=lambda: controller.show_frame(1))
        button4 = tk.Button(self, text="Quit", bg="gray40",
                            command=lambda: self.terminate())

        button1.pack(fill="both", expand=True)
        button2.pack(fill="both", expand=True)
        buttun3.pack(fill="both", expand=True)
        button4.pack(fill="both", expand=True)

    def terminate(self):

        path = fr'c:/users/{os.getlogin()}/desktop/Gui-Skeleton'

        try:
            os.rmdir(path)
        except OSError as err:
            print(f"Error Deleting tmp folder! {err}")

        exit()

if __name__ == "__main__":

    path = fr'c:/users/{os.getlogin()}/desktop/Gui-Skeleton'

    try:
        if os.path.isdir(path):
            pass
        else:
            os.mkdir(path)

    except OSError as err:
        print(f"[!] Operation failed! {err}")

    app = GUI()
    app.geometry("800x600")
    app.mainloop()

.................................................. ..................................................... ..................................................... ..................................................... ..................................................... ....................

【问题讨论】:

  • 问题中的代码由于多种原因无法运行。请尝试提供我们可以运行的代码。

标签: python user-interface tkinter tkinter-layout


【解决方案1】:

您询问的具体问题是由于您使用gridmenucontainer 放在根窗口中,但您没有在根窗口中提供任何行或列重量。因此,menugrid 都将使用尽可能少的空间。

一般的经验法则是,当您使用grid 时,您应该为至少一行和一列赋予正权重,以便没有未使用的空间。您没有在根窗口中执行此操作。有关网格权重的更多信息,请参阅What does 'weight' do in tkinter?

解决方案很简单:确保在根窗口中至少给一行和一列赋予了正权重:

self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(1, weight=1)

话虽如此,我建议将pack 用于menucontainer,因为它们是直接在根窗口中的唯一小部件。在按行或列布置小部件时,pack 通常比 grid 好,如果没有其他原因您不必采取额外的分配权重步骤。

menu.pack(side="left", fill="y")
container.pack(side="right", fill="both", expand=True)

【讨论】:

    猜你喜欢
    • 2014-07-04
    • 2020-06-07
    • 2017-01-20
    • 1970-01-01
    • 2010-12-12
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多