我在调整标签宽度以反映窗口当前宽度时遇到问题。当窗口大小改变时,我想要标记以填充行中其他小部件消耗所需宽度之后剩余的宽度。 将标签放在框架中并使用 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()
答案 0 :(得分:1)
不清楚为什么要在框架中使用标签。我怀疑这是一个XY problem。您可以获得标签以消耗额外的空间,而无需在框架内放置标签。但是,由于您发布了一些具有非常具体问题的非常具体的代码,这就是我要解决的问题。
为什么label9不会出现在label8
旁边
因为您要将标签创建为根窗口的子项而不是框架的子项。您需要在div {float:left;}
内self
生成标签{<1}}:
PixelLabel
如何使label9调整大小以满足当前窗口大小(此代码只是一个示例,我希望能够在函数重塑窗口时动态更改窗口大小时调整label9的大小)
还有一些问题。首先,您需要将class PixelLabel(...):
def __init__(...):
...
self.label = ttk.Label(self, ...)
...
内的框架的第0列设为非零权重,以便它使用所有可用空间(或切换到PixelFrame
)。
pack
其次,在窗口中放置class PixelLabel(...):
def __init__(...):
...
self.grid_columnconfigure(0, weight=1)
...
时,您需要使用sticky
属性,以便扩展以填充其空间:
nest_frame