tkinter 调整标签宽度(grid_propagate 不工作)
tkinter resize label width (grid_propagate not working)
我在调整标签宽度以反映 window 的当前宽度时遇到问题。当 window 大小发生变化时,我希望标签能够填充行中其他小部件消耗其所需宽度后剩下的剩余宽度。
将标签放在框架中并使用 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()
- 为什么 label9 没有出现在 label8 旁边
- 如何使 label9 调整大小以满足当前 window 大小(此代码只是一个示例,我希望能够调整 label9 的大小,因为 window 大小在函数重塑时动态变化window)
不清楚为什么要在框架中使用标签。我怀疑这是一个 XY problem。您可以让标签消耗额外的 space 而无需将标签放在框架内。但是,由于您发布了一些非常具体的代码和非常具体的问题,这就是我要解决的问题。
Why label9 does not appear next to label8
因为您将标签创建为根 window 的子项而不是框架的子项。您需要在 PixelLabel
:
中将标签创建为 self
的子项
class PixelLabel(...):
def __init__(...):
...
self.label = ttk.Label(self, ...)
...
How to make label9 resize to meet current window size (this code is just a sample, I would like to be able to resize label9 as the window size changes dynamically when functions are reshaping the window)
还有几个问题。首先,您需要给 PixelFrame
内框架的第零列一个非零权重,以便它使用所有可用的 space(或者,切换到 pack
)。
class PixelLabel(...):
def __init__(...):
...
self.grid_columnconfigure(0, weight=1)
...
其次,在 window 中放置 nest_frame
时需要使用 sticky
属性,以便扩展以填充其 space:
nest_frame.grid(..., sticky="ew")
我在调整标签宽度以反映 window 的当前宽度时遇到问题。当 window 大小发生变化时,我希望标签能够填充行中其他小部件消耗其所需宽度后剩下的剩余宽度。 将标签放在框架中并使用 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()
- 为什么 label9 没有出现在 label8 旁边
- 如何使 label9 调整大小以满足当前 window 大小(此代码只是一个示例,我希望能够调整 label9 的大小,因为 window 大小在函数重塑时动态变化window)
不清楚为什么要在框架中使用标签。我怀疑这是一个 XY problem。您可以让标签消耗额外的 space 而无需将标签放在框架内。但是,由于您发布了一些非常具体的代码和非常具体的问题,这就是我要解决的问题。
Why label9 does not appear next to label8
因为您将标签创建为根 window 的子项而不是框架的子项。您需要在 PixelLabel
:
self
的子项
class PixelLabel(...):
def __init__(...):
...
self.label = ttk.Label(self, ...)
...
How to make label9 resize to meet current window size (this code is just a sample, I would like to be able to resize label9 as the window size changes dynamically when functions are reshaping the window)
还有几个问题。首先,您需要给 PixelFrame
内框架的第零列一个非零权重,以便它使用所有可用的 space(或者,切换到 pack
)。
class PixelLabel(...):
def __init__(...):
...
self.grid_columnconfigure(0, weight=1)
...
其次,在 window 中放置 nest_frame
时需要使用 sticky
属性,以便扩展以填充其 space:
nest_frame.grid(..., sticky="ew")