如何在 Tkinter 中使同一列上的两个小部件具有不同的宽度?

How can I make two widgets on the same column have different widths in Tkinter?

我正在尝试找到一种格式化此 tkinter GUI 的方法,以便我可以在同一列中使用不同宽度的小部件。我想这样做,以便每个标签的两侧都没有不必要的白色 space,并且可以直接位于其输入框旁边。我试过缩小列,但这会掩盖提示。可能还有另一种我不知道的方式会以一种视觉上吸引人的方式对其进行格式化。我愿意接受任何建议。

This is what it currently looks like.

import tkinter as tk

responses = ['running', 'reading', 'programming', 'fishing']
prompt_2 = "At what time do you want to do each activity?"

root = tk.Tk()
root.geometry("335x200")
root.title("Schedule Maker")

prompt = tk.Label(
    root,
    text=prompt_2
)
button = tk.Button(
    root,
    text="ENTER",
    width=10,
    height=2
)

button.grid(row=len(responses)+1, column=0)
prompt.grid(row=0, column=0)
prompt['text'] = prompt_2
label0_list = []
label1_list = []
entry0_list = []
entry1_list = []
for w in range(len(responses)):
    label0 = tk.Label(root, text=responses[w] + ":")
    label0.grid(row=w+1, column=0)
    label0_list.append(label0)
    label1 = tk.Label(root, text='to')
    label1.grid(row=w+1, column=2)
    label1_list.append(label1)
    entry0 = tk.Entry(root, width=6)
    entry0.grid(row=w+1, column=1)
    entry0_list.append(entry0)
    entry1 = tk.Entry(root, width=6)
    entry1.grid(row=w+1, column=3)
    entry1_list.append(entry1)


root.mainloop()

tk.Tk() 视为 space 的 矩形,您可以在其中放置您的内容。 内容由您选择的几何管理器管理,例如 packgrid。 有时人们称这些 space 容器的矩形。

框架用于有一个单独的区域,您可以在其中组织内容,具有不同的设置。所以框架是您 window 中的容器。您可以在根目录中使用 pack 并在框架中使用 grid,而不会出现任何错误。

所以我通常做的是想象根是 space 的填充 区域,然后我在脑海中将它分成一些块,我 放置 我的相框。像这样:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

header = tk.Frame(root)
body = tk.Frame(root)
bottom_line = tk.Frame(root)

header.pack(side='top')
body.pack()
bottom_line.pack(side='bottom')

在此之后,我用它所属的内容填充containers/frames,例如:

#header content
headline = tk.Label(header, text='At what time do you want to do each?')
headline.pack(fill='x')
#body content
first_activity = tk.Label(body,text='running:')
first_from = tk.Entry(body)
first_sep = tk.Label(body, text='to')
first_to = tk.Entry(body)

first_activity.pack(side='left')
first_from.pack(side='left')
first_sep.pack(side='left')
first_to.pack(side='left')
#bottom content
my_button = tk.Button(bottom_line, text='Enter')
my_button.pack(fill='x')

更多详情

PS: 如果你真的想使用网格和你的环境集,你也可以使用 prompt.grid(row=0, column=0,columnspan=4)。但是看起来有点不一样。

您可以在 label0.grid(...) 上使用 sticky="e":

label0.grid(row=w+1, column=0, sticky="e")