python - 当窗口大小调整时,如何调整放置的 tkinter 小部件的大小?

标签 python class tkinter

我已阅读本网站上发布的其他问题,但无法解决我的问题。 我正在开发一个 tkinter 应用程序,为了使其看起来尽可能好,我选择使用 .place() 在屏幕上显示小部件。每个小部件的 x 和 y 值都是固定的,但我希望窗口可以调整大小,并且小部件可以适应并保持相同的比例。请参阅随附的代码以及 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()

较小的窗口:

Screenshot 1 smaller window

更大的窗口:

Screenshot 2 bigger window

正常和默认:

Screenshot 3 normal and default

最佳答案

您可以使用网格几何管理器,而不是使用位置。 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 为每一行和每一列赋予权重0。这意味着如果一列没有小部件,它在屏幕上的宽度将为零。

为列指定非零权重可确保它在屏幕上始终具有一定的宽度,即使它是空的。

如果您将列 0 和 1 的权重设置为 1,假设所有其他列的权重均为 0(甚至如果您调整窗口大小)。 .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 = _)

说明:

  • 行、列:不言自明
  • sticky:小部件在范围内扩展的方向 容器小部件为其分配的空间。 n、s、e、w 分别代表 四个方向。
  • rowspan:如果你使用过.grid_rowconfigure,可以使用rowspan来告诉 tkinter 小部件应“跨越”多少行
  • columnspan:与rowspan类似
  • padx:水平内边距
  • pady:垂直内边距
  • ipadx:内部水平内边距
  • ipady:内部垂直内边距

网格语句示例:

widget.grid(row = 0, column = 1, sticky = "nsew", rowspan = 3, columnspan = 2, padx = 5, pady = 5, ipadx = 3, ipadx = 3)

关于python - 当窗口大小调整时,如何调整放置的 tkinter 小部件的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71158186/

相关文章:

python - 在 Python 中使用 re 将 CSV 单元格值用作正则表达式字符串

python - Python中如何有效保存引用的类类型? (应用引擎)

java - 自定义矩形类不起作用

python - 类型错误 : unsupported operand type(s)s for +: 'StringVar' and 'str' //Create a text file

python - Tkinter 方法 deiconify 似乎不适用于 ubuntu(12.04,统一)

python - 如何找到 DataFrame 行的所有组合?

python - python中FFT的循环加速(使用 `np.einsum`)

Java 泛型类数组

swift - 我如何在另一个类中使用此扩展委托(delegate)更新我的 ViewController UI

python - 如何将字符串用于图标位图?