【问题标题】:How can I make two widgets on the same column have different widths in Tkinter?如何在 Tkinter 中使同一列上的两个小部件具有不同的宽度?
【发布时间】:2020-12-20 07:19:18
【问题描述】:

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

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()

【问题讨论】:

    标签: python python-3.x tkinter tkinter-entry tkinter-layout


    【解决方案1】:

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

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

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

    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')
    

    在此之后,我用它所属的内容填充容器/框架,例如:

    #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')
    

    更多详情[click]

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-12
        • 1970-01-01
        • 2015-01-19
        相关资源
        最近更新 更多