tkinter 如何将小部件向右对齐,而与左侧小部件的长度无关?

App*_*tor 1 python tkinter

我想将条目小部件向右对齐,而与左侧标签的宽度无关。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()
Run Code Online (Sandbox Code Playgroud)

我尝试过使用sticky="e"但没有任何改变。我不想使用,pack(side='right')因为如果窗口宽度增加,它会看起来混乱/难看。

Sri*_*san 5

Sticky = 'e' 在这种情况下不起作用的原因是因为您没有使用weight. 如果您weight在左侧或右侧(或两者)的列中添加 a ,您的问题应该得到解决。

什么是weight

任何行或列的默认值为weight0。如果您不给行或列任何值weight,它将只占用所需的空间来容纳内部的小部件。但是,如果您为该列指定 a weight,则表示您要求该列占用尽可能多的空间。

直觉:将框架中的可用空间想象成矩形弹性片。通过向不同的行和列添加所需的权重,您可以使工作表在正确的区域按比例展开。

添加weights到行和列:

<containter-widget>.grid_columnconfigure(<column number>, weight = <whole number>)

<containter-widget>.grid_rowconfigure(<row number>, weight = <whole number>)
Run Code Online (Sandbox Code Playgroud)

运行此代码可以更好地理解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()
Run Code Online (Sandbox Code Playgroud)

尝试调整 的值weights并查看会发生什么变化。