tkinter 对齐框架内的按钮与网格()

tkinter align button within frame with grid()

我正在创建小型便签本应用程序。整个应用程序是单列和 3 行。第 0 行将有一个右对齐的关闭按钮,第 1 行是文本区域,第 2 行将有几个按钮来格式化文本 + 1 个按钮到 delete/clear 文本区域。我希望 delete/clear 按钮向右对齐,而其余按钮向左对齐,以便在格式按钮和删除按钮之间有一个 space。这样您就不会不小心清除文本。这是代码:

import tkinter as tk
from tkinter import ttk

wn = tk.Tk()
wn.attributes('-type', 'splash')
style = ttk.Style()
style.configure('top.TFrame', border=0, borderwidth=0, background='green')
style.configure('bottom.TFrame', border=0, borderwidth=0, background='blue')
style.configure('button.TButton', border=5, borderwidth=5, background='#e6e497', bd=5)

root = ttk.Frame(wn, style='top.TFrame', borderwidth=5, relief='ridge')
button = ttk.Button(root, text='X', width=3, command=lambda: wn.destroy(), style='button.TButton')
txt = tk.Text(root, width=40, background='light yellow', bd=5)

bottom = ttk.Frame(root, style='bottom.TFrame', width=2000, borderwidth=5, relief='ridge')
bottombuttona = ttk.Button(bottom, width=3, text='A')
bottombuttonb = ttk.Button(bottom, width=3, text='B')
bottombuttonc = ttk.Button(bottom, width=3, text='C')
bottombuttond = ttk.Button(bottom, width=3, text='D')
bottombuttone = ttk.Button(bottom, width=3, text='E')

root.grid()
button.grid(column=0, row=0, sticky=tk.E, ipady=4)
txt.grid(column=0, row=1, sticky=tk.NSEW)
bottom.grid(column=0, row=2, sticky=tk.NSEW)

bottombuttona.grid(column=0, row=2, ipady=5)
bottombuttonb.grid(column=1, row=2, ipady=5)
bottombuttonc.grid(column=2, row=2, ipady=5)
bottombuttond.grid(column=3, row=2, ipady=5)
bottombuttone.grid(column=4, row=2, ipady=5, sticky=tk.E)

txt.focus_force()
wn.bind('<Escape>', lambda x: wn.destroy())
wn.mainloop()

这是结果:

问题: 如何将 bottombuttone (E) 移动到 bottom 框架的右侧(蓝色)? sticky 好像不行

第二个问题:Frame class 中的 width 选项的目的是什么?尽管将其设置为 2000,但似乎对框架本身的大小没有任何影响。

您可以使用 grid_columnconfigure 让它工作:

...
bottombuttond.grid(column=3, row=2, ipady=5)
bottom.grid_columnconfigure(4, weight = 1)
bottombuttone.grid(column=4, row=2, ipady=5, sticky=tk.E)
...

将最后一项的权重设置为 1 可使其扩展以填充其父项。使用 sticky = tk.E,它将粘在其父级的右侧。

我这样做是为了演示网格权重是如何工作的。蓝色是父控件,C1-3 是子控件。