我想將條目小部件向右對齊,與左側標簽的寬度無關。Id 標題的寬度應該無關緊要。無論標題的寬度如何,條目小部件都應該對齊。

這是我的代碼:
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title('test')
root.geometry("500x800")
# main frame
main_frame = tk.Frame(root)
main_frame.pack(expand=1, fill='both')
# the message
title = tk.Label(main_frame, text="title 1", bg='white')
title.pack(padx=8, pady=8, fill='x')
foo1_frame = tk.Frame(main_frame)
foo1_frame.pack(padx=8, pady=8, fill='x')
foo1_label = tk.Label(foo1_frame, text="short title foo1")
foo1_label.grid(row=0, column=0)
foo1_entry_box = tk.Entry(foo1_frame, width=10)
foo1_entry_box.grid(row=0, column=2, sticky='e') #sticky does nothing in this case
foo2_frame = tk.Frame(main_frame)
foo2_frame.pack(padx=8, pady=8, fill='x')
foo2_label = tk.Label(foo2_frame, text="loooooooooooonger title foo2")
foo2_label.grid(row=1, column=0)
foo2_entry_box = tk.Entry(foo2_frame, width=10)
foo2_entry_box.grid(row=1, column=2)
root.mainloop()
我試過使用sticky="e"但沒有任何改變。我不想使用pack(side='right'),因為如果視窗寬度增加,它會顯得凌亂/丑陋。
uj5u.com熱心網友回復:
在這種情況下,sticky = 'e' 不起作用的原因是因為您沒有使用weight. 如果您weight在左側或右側(或兩者)的列中添加 a,您的問題應該得到解決。
是什么weight?
任何行或列的默認weight值為 0。如果您不提供任何行或列weight,它將只占用所需的空間來容納內部的小部件。但是如果你給列 a weight,你是在要求列占用盡可能多的空間。
直覺:將框架中的可用空間想象為矩形彈性板。通過將所需的權重添加到不同的行和列,您可以按比例使作業表在正確的區域展開。
添加weights到行和列:
<containter-widget>.grid_columnconfigure(<column number>, weight = <whole number>)
<containter-widget>.grid_rowconfigure(<row number>, weight = <whole number>)
運行此代碼以weights更好地理解:
from tkinter import *
root = Tk()
#Gridding root column-wise
root.grid_columnconfigure(0, weight = 2)
root.grid_columnconfigure(1, weight = 1)
#Gridding root row-wise
root.grid_rowconfigure(0, weight = 1)
frame_left = Frame(root, bg = "blue")
frame_right = Frame(root, bg = "green")
frame_left.grid(row = 0, column = 0, sticky = NSEW)
frame_right.grid(row = 0, column = 1, sticky = NSEW)
root.mainloop()
嘗試調整 的值,weights看看會發生什么變化。
uj5u.com熱心網友回復:
您必須允許第 0 列的幀來填充幀大小:使用foo1_frame.columnconfigure(0, weight=1)
root = tk.Tk()
root.title('test')
root.geometry("500x800")
# main frame
main_frame = tk.Frame(root)
main_frame.pack(expand=1, fill='both')
# the message
title = tk.Label(main_frame, text="title 1", bg='white')
title.pack(padx=8, pady=8, fill='x')
foo1_frame = tk.Frame(main_frame)
foo1_frame.pack(padx=8, pady=8, fill='x')
foo1_frame.columnconfigure(0, weight=1) # expand column 0
foo1_label = tk.Label(foo1_frame, text="short title foo1")
foo1_label.grid(row=0, column=0, sticky='w') # sticky='w'
foo1_entry_box = tk.Entry(foo1_frame, width=10)
foo1_entry_box.grid(row=0, column=2, sticky='e') # sticky='e'
foo2_frame = tk.Frame(main_frame)
foo2_frame.pack(padx=8, pady=8, fill='x')
foo2_frame.columnconfigure(0, weight=1) # expand column 0
foo2_label = tk.Label(foo2_frame, text="loooooooooooonger title foo2")
foo2_label.grid(row=1, column=0, sticky='w') # sticky='w'
foo2_entry_box = tk.Entry(foo2_frame, width=10)
foo2_entry_box.grid(row=1, column=2, sticky='e') # sticky='e'
root.mainloop()
uj5u.com熱心網友回復:
我有一個不同的答案,希望它對你有用,這里是代碼:
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.title('test')
root.geometry("500x800")
# main frame
# main_frame = tk.Frame(root)
# main_frame.pack(expand=1, fill='both')
# the message
title = tk.Label(root, text="title 1", bg='white')
title.place(relx = 0.0, rely=0.01, relwidth = 1.0)
# foo1_frame = tk.Frame(root)
# foo1_frame.pack(padx=8, pady=8, fill='x')
foo1_label = tk.Label(root, text="short title foo1")
foo1_label.place(relx = 0.1, rely = 0.05)
foo1_entry_box = tk.Entry(root, width=10)
foo1_entry_box.place(relx = 0.7, rely = 0.05) #sticky does nothing in this case
# foo2_frame = tk.Frame(root)
# foo2_frame.pack(padx=8, pady=8, fill='x')
foo2_label = tk.Label(root, text="loooooooooooonger title foo2")
foo2_label.place(relx = 0.1, rely = 0.1)
foo2_entry_box = tk.Entry(root, width=10)
foo2_entry_box.place(relx = 0.7, rely = 0.1)
root.mainloop()
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/427101.html
上一篇:錯誤:TypeError:必須是str,而不是NoneType,同時使用BeautifulSoup從網站上抓取串列鏈接
