无法阻止标签扩展主窗口

时间:2019-10-24 13:06:38

标签: python tkinter

示例

(模仿我实际代码中布局的相关部分)

import Tkinter as tk
import ttk

# set up root
root = tk.Tk()
root.minsize(300, 50)
frame = ttk.Frame(root)
frame.grid(row=0, column=0, sticky=tk.EW)

# set up buttons that insert a short or a long string
textvar = tk.StringVar(value='foo')

def insert_short():
    textvar.set('foo')

def insert_long():
    textvar.set('foo'*30)

button_short = ttk.Button(frame, text='short', command=insert_short)
button_short.grid(row=0, column=0)
button_long = ttk.Button(frame, text='long', command=insert_long)
button_short.grid(row=0, column=0)
button_long.grid(row=0, column=1)

# set up label

# border for label to see its size
style = ttk.Style()
style.configure(
    'Bordered.TLabel', foreground='black', borderwidth=1, relief='solid')

# make label extend to the right
frame.columnconfigure(2, weight=1)

# place label
label = ttk.Label(frame, textvariable=textvar, style='Bordered.TLabel')
label.grid(row=0, column=2, sticky=tk.EW)

# place some other widget under label to mimic my real code
ttk.Button(frame, text='some other widget').grid(row=1, column=2)

# TRIED, NOT WORKING:
#root.resizable(False, False)
#frame.propagate(False)
#frame.grid_propagate(False)
#label.propagate(False)
#label.grid_propagate(False)

root.mainloop()

输出

问题

如何防止label扩展主窗口?

(奖励问题,但并不重要:如果标签太长,是否可以使标签可滚动?)

尝试

我尝试了以下命令:

root.resizable(False, False)
frame.propagate(False)
frame.grid_propagate(False)
label.propagate(False)
label.grid_propagate(False)

2 个答案:

答案 0 :(得分:3)

您可以使用Entry处于只读状态来创建可滚动标签,通过滚动可以防止小部件扩展主窗口。

尝试用以下代码替换标签定义:

child_frm = ttk.Frame(frame)
label = ttk.Entry(child_frm, textvariable=textvar, style='Bordered.TLabel', state='readonly')
scroll = ttk.Scrollbar(child_frm, orient='horizontal', command=label.xview)
label.config(xscrollcommand=scroll.set)
label.grid(row=0, sticky=tk.EW)
scroll.grid(row=1, sticky=tk.EW)
child_frm.grid(row=0, column=2)

答案 1 :(得分:2)

默认情况下,Label的宽度是根据其内容计算的。您可以通过在创建标签时为width指定一个值来覆盖此行为。

label = ttk.Label(frame, textvariable=textvar, style='Bordered.TLabel', width=1)

令我惊讶的是,当我以此方式更新您的代码时,标签没有缩小到适合显示一个字符的大小。看来,您的sticky=tk.EW调用的grid参数可以确保标签保持与列中最宽的元素一样宽。

enter image description here