调整 window 大小时如何调整放置的 tkinter 小部件的大小?
How do I resize placed tkinter widgets when the window is resized?
我已阅读此站点上发布的其他问题,但无法解决我的问题。
我正在开发一个 tkinter 应用程序,为了让它看起来尽可能好,我选择使用 .place()
在屏幕上显示小部件。 x 和 y 的值对于每个小部件都是固定的,但我希望 window 可以调整大小并且小部件可以保持相同的比例。查看随附的代码以及 GUI 的外观
import tkinter as tk
from tkinter import messagebox
class MyClass:
def __init__(self, root):
self.root = root
self.root.title("App")
self.root.geometry("600x300")
self.welcome_label = tk.Label(self.root, text="Welcome", justify="center", fg="blue", font=("Arial", 24))
self.welcome_label.place(x=230, y=40)
self.username_label = tk.Label(self.root, text="Username:")
self.username_label.place(x=140, y=100)
self.username_box = tk.Entry(self.root, bd=3, selectbackground="#e5e3e3")
self.username_box.place(x=230, y=100)
self.password_label = tk.Label(self.root, text="Password:")
self.password_label.place(x=140, y=150)
self.password_box = tk.Entry(self.root, bd=3, selectbackground="#e5e3e3")
self.password_box.place(x=230, y=150)
self.log_in_buttonn = tk.Button(self.root, text="Log In", justify="center", command=self.log_inn)
self.log_in_buttonn.place(x=470, y=230, width=70, height=50)
self.register_button = tk.Button(self.root, text="Register", command=self.register)
self.register_button.place(x=100, y=230, width=70, height=50)
def log_inn(self):
...
def register(self):
...
if __name__ == "__main__":
roott = tk.Tk()
app = MyClass(roott)
roott.mainloop()
更小 window:
更大 window:
正常和默认:
您可以使用网格几何管理器来代替地点。 Tkinter 将处理所有调整大小的问题,输出看起来很完美!使用 place 获得相同的结果要困难得多,因为它接受高度硬编码的值。网格是相对的。
在容器小部件上使用 .grid_rowconfigure
和 .grid_columnconfigure
:
<containter_widget>.grid_rowconfigure(<row number>, weight = <whole number>)
<containter_widget>.grid_columnconfigure(<column number>, weight = <whole number>)
解释:
Tkinter 默认给每行和每列一个 weight
0。这意味着如果一列没有小部件,它在屏幕上的宽度将为零。
给一列一个 non-zero weight
确保它在屏幕上总是有一定的宽度,即使它是空的。
如果您给第 0 列和第 1 列一个 weight
of 1,假设所有其他列的权重为0(即使您调整 window 的大小)。 .grid_rowconfigure
工作方式类似。
使用.grid
:
<widget>.grid(row = <row number>, column = <column number>, sticky = <combination of n,s,e,w as a string>, rowspan = _, columnspan = _, padx = _, pady = _, ipadx = _, ipady = _)
解释:
- 行、列:self-explanatory
- sticky:小部件应在其中展开的方向
space 由容器小部件为其分配。 n, s, e, w 代表
四个方向。
- rowspan:如果你用过
.grid_rowconfigure
,可以用rowspan来告诉
tkinter 小部件“跨度”应该有多少行
- 列跨度:类似于行跨度
- padx: 水平填充
- pady:垂直填充
- ipadx: 内部水平填充
- ipady:内部垂直填充
示例网格语句:
widget.grid(row = 0, column = 1, sticky = "nsew", rowspan = 3, columnspan = 2, padx = 5, pady = 5, ipadx = 3, ipadx = 3)
我已阅读此站点上发布的其他问题,但无法解决我的问题。
我正在开发一个 tkinter 应用程序,为了让它看起来尽可能好,我选择使用 .place()
在屏幕上显示小部件。 x 和 y 的值对于每个小部件都是固定的,但我希望 window 可以调整大小并且小部件可以保持相同的比例。查看随附的代码以及 GUI 的外观
import tkinter as tk
from tkinter import messagebox
class MyClass:
def __init__(self, root):
self.root = root
self.root.title("App")
self.root.geometry("600x300")
self.welcome_label = tk.Label(self.root, text="Welcome", justify="center", fg="blue", font=("Arial", 24))
self.welcome_label.place(x=230, y=40)
self.username_label = tk.Label(self.root, text="Username:")
self.username_label.place(x=140, y=100)
self.username_box = tk.Entry(self.root, bd=3, selectbackground="#e5e3e3")
self.username_box.place(x=230, y=100)
self.password_label = tk.Label(self.root, text="Password:")
self.password_label.place(x=140, y=150)
self.password_box = tk.Entry(self.root, bd=3, selectbackground="#e5e3e3")
self.password_box.place(x=230, y=150)
self.log_in_buttonn = tk.Button(self.root, text="Log In", justify="center", command=self.log_inn)
self.log_in_buttonn.place(x=470, y=230, width=70, height=50)
self.register_button = tk.Button(self.root, text="Register", command=self.register)
self.register_button.place(x=100, y=230, width=70, height=50)
def log_inn(self):
...
def register(self):
...
if __name__ == "__main__":
roott = tk.Tk()
app = MyClass(roott)
roott.mainloop()
更小 window:
更大 window:
正常和默认:
您可以使用网格几何管理器来代替地点。 Tkinter 将处理所有调整大小的问题,输出看起来很完美!使用 place 获得相同的结果要困难得多,因为它接受高度硬编码的值。网格是相对的。
在容器小部件上使用 .grid_rowconfigure
和 .grid_columnconfigure
:
<containter_widget>.grid_rowconfigure(<row number>, weight = <whole number>)
<containter_widget>.grid_columnconfigure(<column number>, weight = <whole number>)
解释:
Tkinter 默认给每行和每列一个 weight
0。这意味着如果一列没有小部件,它在屏幕上的宽度将为零。
给一列一个 non-zero weight
确保它在屏幕上总是有一定的宽度,即使它是空的。
如果您给第 0 列和第 1 列一个 weight
of 1,假设所有其他列的权重为0(即使您调整 window 的大小)。 .grid_rowconfigure
工作方式类似。
使用.grid
:
<widget>.grid(row = <row number>, column = <column number>, sticky = <combination of n,s,e,w as a string>, rowspan = _, columnspan = _, padx = _, pady = _, ipadx = _, ipady = _)
解释:
- 行、列:self-explanatory
- sticky:小部件应在其中展开的方向 space 由容器小部件为其分配。 n, s, e, w 代表 四个方向。
- rowspan:如果你用过
.grid_rowconfigure
,可以用rowspan来告诉 tkinter 小部件“跨度”应该有多少行 - 列跨度:类似于行跨度
- padx: 水平填充
- pady:垂直填充
- ipadx: 内部水平填充
- ipady:内部垂直填充
示例网格语句:
widget.grid(row = 0, column = 1, sticky = "nsew", rowspan = 3, columnspan = 2, padx = 5, pady = 5, ipadx = 3, ipadx = 3)