当在不同的小部件上使用 place 时,小部件被识别为框架 python 3 tkinter

widget is being recognized as a frame when using place on a different widget python 3 tkinter

我正在尝试制作一个可以转到不同帧的应用程序,但我 运行 遇到了一个看似基本的问题,但对我来说是新问题,不知道如何解决。如何使用 place 在框架上移动小部件? 当我尝试在 about_btn:

上使用此代码时
self.about_btn.place(rely=0.5)

然后开始按钮被关于按钮覆盖了一半,我想知道为什么会这样,我该如何解决?使用更高的依赖值按钮将被不同的框架覆盖。我想使用 place 自由地移动小部件并将它们移动到特定的框架上。对代码的任何帮助和建议或改进都会非常有帮助,这是我的示例代码:

import tkinter as tk
from tkinter import *


class App():
    def __init__(self, parent):
        self.app = parent
        self.app.geometry("300x300")
        self.app.title("test application")

        self.home_frame = tk.Frame(self.app)
        self.category_frame = tk.Frame(self.app)
        self.home_frame.pack()

        self.start_btn = tk.Button(self.home_frame, text="Start")
        self.start_btn.pack()

        self.about_btn = tk.Button(self.home_frame, text="About")
        self.about_btn.place(rely=0.5)

if __name__ == "__main__":
    app1 = tk.Tk()
    App_class = App(app1)
    app1.resizable(False, False)
    app1.mainloop()

不要在一个容器中混用几何管理算法。您在 home_frame 容器中对 start_btn 使用 pack,对 about_btn 使用 place。选择一个 - 最好是网格或包。地方平时不太懂事。

例如,将按钮放在顶部和右侧的一行中:

self.home_frame.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
self.about_btn.pack(side=tk.RIGHT, anchor=tk.NE)
self.start_btn.pack(side=tk.RIGHT, anchor=tk.NE)

改用地点:

self.home_frame.place(relwidth=1.0, relheight=1.0)
self.start_btn.place(relx=0.5, rely=0, relwidth=0.25)
self.about_btn.place(relx=0.75, rely=0, relwidth=0.25)

老实说,学会使用网格。这将是值得的。这是一个重新设计的版本,展示了两个按钮的所有三个几何管理器。

import tkinter as tk

class App():
    def __init__(self, parent):
        self.app = parent
        self.app.geometry("300x300")
        self.app.title("test application")

        f1 = tk.Frame(self.app, relief=tk.GROOVE, borderwidth=2)
        b1a = tk.Button(f1, text="Place A")
        b1b = tk.Button(f1, text="Place B")
        b1a.place(relx=0.5, rely=0, relwidth=0.25)
        b1b.place(relx=0.75, rely=0, relwidth=0.25)

        f2 = tk.Frame(self.app, relief=tk.GROOVE, borderwidth=2)
        b2a = tk.Button(f2, text="Two A")
        b2b = tk.Button(f2, text="Two B")
        b2b.pack(side=tk.RIGHT, anchor=tk.NE)
        b2a.pack(side=tk.RIGHT, anchor=tk.NE)

        f3 = tk.Frame(self.app, relief=tk.GROOVE, borderwidth=2)
        b3a = tk.Button(f3, text="Grid A")
        b3b = tk.Button(f3, text="Grid B")
        b3a.grid(row=0, column=0, sticky=tk.NE)
        b3b.grid(row=0, column=1, sticky=tk.NE)
        f3.grid_rowconfigure(0, weight=1)
        f3.grid_columnconfigure(0, weight=1)

        f1.grid(row=0, column=0, sticky=tk.NSEW)
        f2.grid(row=1, column=0, sticky=tk.NSEW)
        f3.grid(row=2, column=0, sticky=tk.NSEW)

        for row in range(0,3):
            parent.grid_rowconfigure(row, weight=1)
        parent.grid_columnconfigure(0, weight=1)


if __name__ == "__main__":
    root = tk.Tk()
    app = App(root)
    #app1.resizable(False, False)
    root.mainloop()