我已閱讀本網站上發布的其他問題,但無法解決我的問題。我正在開發一個 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()
螢屏截圖 1 個較小的視窗
螢屏截圖 2 更大的視窗
截圖 3 正常和默認
uj5u.com熱心網友回復:
您可以使用網格幾何管理器,而不是使用地點。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 將每一行和每一列的 a 都設為weight0。這意味著如果一列沒有小部件,它在螢屏上的寬度將為零。
給一列非零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 小部件應該“跨越”多少行 - 列跨度:類似于行跨度
- padx:水平填充
- pady:垂直填充
- ipadx:內部水平填充
- ipady:內部垂直填充
示例網格陳述句:
widget.grid(row = 0, column = 1, sticky = "nsew", rowspan = 3, columnspan = 2, padx = 5, pady = 5, ipadx = 3, ipadx = 3)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/426706.html
上一篇:將通用動作存盤在字典中
