在不同的小部件Python3 tkinter上使用place时,小部件被识别为一个框架

在不同的小部件Python3 tkinter上使用place时,小部件被识别为一个框架,python,tkinter,frames,Python,Tkinter,Frames,我试图制作一个可以进入不同框架的应用程序,但我遇到了一个看似基本的问题,但对我来说是新问题,不知道如何解决它。如何使用place移动框架上的小部件? 当我尝试在about_btn上使用此代码时: self.about_btn.place(rely=0.5) 然后“开始”按钮被“关于”按钮覆盖了一半,我想知道它为什么要这样做,以及如何修复它?使用较高的依赖值按钮将被不同的帧覆盖。我想使用place移动小部件,并在特定的框架上移动它们。对代码的任何帮助、建议或改进都将非常有用,下面是我的示例代码:

我试图制作一个可以进入不同框架的应用程序,但我遇到了一个看似基本的问题,但对我来说是新问题,不知道如何解决它。如何使用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()

不要在容器中混合几何体管理算法。您正在使用
pack
作为
start\u btn
place
作为
about\u btn
两个容器中的
home\u框架。选择一个-理想情况下,网格或包。这个地方通常是不明智的

例如,要将按钮放在顶部和右侧的一行上,请执行以下操作:

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)
改用place:

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()

如果你想要一个有用的答案,你需要提供一个简单的例子来说明你的问题。通常,要包含在框架中的小部件应该将该框架指定为其父框架。然后,像键盘焦点选项卡这样的功能就可以正常工作了。