【问题标题】:tkinter resize label width (grid_propagate not working)tkinter 调整标签宽度(grid_propagate 不工作)
【发布时间】:2023-03-23 12:09:01
【问题描述】:

我在调整标签的宽度以反映窗口的当前宽度时遇到问题。当窗口大小发生变化时,我希望标签填充行中其他小部件消耗所需宽度后剩余的宽度。 将标签放在 Frame 中并使用 grid_propagate(False) 似乎不起作用。 考虑以下代码:

import tkinter as tk
import tkinter.ttk as ttk


class PixelLabel(ttk.Frame):
    def __init__(self,master, w, h=20, *args, **kwargs):
        '''
        creates label inside frame,
        then frame is set NOT to adjust to child(label) size
        and the label keeps extending inside frame to fill it all,
        whatever long text inside it is
        '''
        ttk.Frame.__init__(self, master, width=w, height=h,borderwidth=1)
        #self.config(highlightbackground="blue")

        self.grid_propagate(False) # don't shrink
        self.label = ttk.Label(*args, **kwargs)
        self.label.grid(sticky='nswe')

    def resize(self,parent,*other_lenghts):
        '''
        resizes label to take rest of the width from parent
        that other childs are not using
        '''
        parent.update()
        new_width = parent.winfo_width()
        print(new_width)

        for lenght in other_lenghts:
            new_width -= lenght
            print(new_width)

        self.configure(width = new_width)

root = tk.Tk()

master = ttk.Frame(root)
master.grid()

label = ttk.Label(master,text='aaa',borderwidth=1, relief='sunken')
label.grid(row=0,column=0)

label1_width = 7
label1 = ttk.Label(master,text='bbbb',borderwidth=1, relief='sunken',width=label1_width)
label1.grid(row=0,column=1)

label2 = ttk.Label(master,text='ccccccccccccccccccccccccccccccccccccc',borderwidth=1, relief='sunken')
label2.grid(row=0,column=2)

label3_width = 9
label2 = ttk.Label(master,text='ddddd',borderwidth=1, relief='sunken',width=label2_width)
label2.grid(row=0,column=3)

label4 = ttk.Label(master,text='ee',borderwidth=1, relief='sunken')
label4.grid(row=1,column=0)

label5 = ttk.Label(master,text='f',borderwidth=1, relief='sunken')
label5.grid(row=1,column=1,sticky='we')

nest_frame = ttk.Frame(master)
nest_frame.grid(row=2,columnspan=4)

label8_width = 9
label8 = ttk.Label(nest_frame,text='xxxxx',borderwidth=1, relief='sunken',width=label8_width)
label8.grid(row=0,column=0)

label9 = PixelLabel(nest_frame, 5, text='should be next to xxxxx but is not?',borderwidth=1, relief='sunken')
label9.grid(row=0,column=1)
label9.resize(root,label2_width)

root.mainloop()
  1. 为什么 label9 没有出现在 label8 旁边
  2. 如何使 label9 调整大小以满足当前窗口大小(此代码只是一个示例,我希望能够在函数重塑窗口时随着窗口大小动态变化而调整 label9 的大小)

【问题讨论】:

  • 好的,但是 grid_propagate False 会阻止 Frame 调整到其子级的大小。因此,如果我为 Frame 禁用它并说“保持我给你的大小”并将 Label 设置为 Sticky'='sw' 到那个 Frame,我应该得到我想要的吗?

标签: python-3.x tkinter label width


【解决方案1】:

尚不清楚为什么要在框架中使用标签。我怀疑这是XY problem。您可以让标签占用额外的空间,而无需将标签放在框架内。但是,由于您发布了一些非常具体的代码和非常具体的问题,这就是我要解决的问题。

为什么label9没有出现在label8旁边

因为您将标签创建为根窗口的子窗口,而不是框架的子窗口。您需要在PixelLabel 内将标签创建为self 的子标签:

class PixelLabel(...):
    def __init__(...):
        ...
        self.label = ttk.Label(self, ...)
        ...

如何使 label9 调整大小以满足当前窗口大小(此代码只是一个示例,我希望能够在函数重塑窗口时随着窗口大小动态变化而调整 label9 的大小)

还有几个问题。首先,您需要为 PixelFrame 内框架的零列赋予非零权重,以便它使用所有可用空间(或者,切换到 pack)。

class PixelLabel(...):
    def __init__(...):
        ...
        self.grid_columnconfigure(0, weight=1)
        ...

其次,在窗口中放置nest_frame 时需要使用sticky 属性,以便它展开以填充其空间:

nest_frame.grid(..., sticky="ew")

【讨论】:

  • 太棒了,成功了!感谢您以这种方式解释它,而不是说“你最好以不同的方式做:......” - 真的很感激!这只是一个示例代码,这种方法看起来是进入适当应用程序的最佳方式。但有一件事:我认为我不需要 'sticky="we" ' - 我有 columnspan=4 所以它已经占用了所有可用宽度(或者我可以吗?)
  • @simplynail: “还是我?” - 试试看。这里有两个概念:给定所有空间,以及填充所有空间。
猜你喜欢
  • 2013-04-30
  • 2013-04-28
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 2014-12-17
相关资源
最近更新 更多