簡體   English   中英

當 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:

屏幕截圖 1 較小的窗口

更大的 window:

屏幕截圖 2 更大的窗口

正常和默認:

截圖3 正常和默認

除了使用 place,您還可以使用網格幾何管理器。 Tkinter 將處理所有調整大小的問題,而 output 將看起來很完美。 使用 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 的weight 這意味着如果一列沒有小部件,它在屏幕上的寬度將為零。

為列賦予非零weight可確保它在屏幕上始終具有一定的寬度,即使它是空的。

如果您為第 0 列和第 1 列賦予weight 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 = _)

解釋:

  • 行,列:不言自明
  • 粘性:小部件應在容器小部件為其分配的空間內擴展的方向。 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM