在不同的小部件Python3 tkinter上使用place时,小部件被识别为一个框架
我试图制作一个可以进入不同框架的应用程序,但我遇到了一个看似基本的问题,但对我来说是新问题,不知道如何解决它。如何使用place移动框架上的小部件? 当我尝试在about_btn上使用此代码时:在不同的小部件Python3 tkinter上使用place时,小部件被识别为一个框架,python,tkinter,frames,Python,Tkinter,Frames,我试图制作一个可以进入不同框架的应用程序,但我遇到了一个看似基本的问题,但对我来说是新问题,不知道如何解决它。如何使用place移动框架上的小部件? 当我尝试在about_btn上使用此代码时: self.about_btn.place(rely=0.5) 然后“开始”按钮被“关于”按钮覆盖了一半,我想知道它为什么要这样做,以及如何修复它?使用较高的依赖值按钮将被不同的帧覆盖。我想使用place移动小部件,并在特定的框架上移动它们。对代码的任何帮助、建议或改进都将非常有用,下面是我的示例代码:
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()
如果你想要一个有用的答案,你需要提供一个简单的例子来说明你的问题。通常,要包含在框架中的小部件应该将该框架指定为其父框架。然后,像键盘焦点选项卡这样的功能就可以正常工作了。