当在不同的小部件上使用 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()
我正在尝试制作一个可以转到不同帧的应用程序,但我 运行 遇到了一个看似基本的问题,但对我来说是新问题,不知道如何解决。如何使用 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()