首页 > 解决方案 > 无法阻止标签扩展主窗口

问题描述

例子

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

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)

标签: pythontkinter

解决方案


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

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

令我惊讶的是,当我用这个更新您的代码时,标签不会缩小到适合显示一个字符的大小。sticky=tk.EW您调用的参数似乎grid确保标签与列中最宽的元素一样宽。

在此处输入图像描述


推荐阅读