2016-07-15 148 views
0

我在調整標籤的寬度以反映窗口的當前寬度方面存在問題。當窗口大小發生變化時,我想用標籤填充剩餘的寬度,在行中的其他窗口小部件消耗寬度後,剩下的寬度就是他們需要的寬度。 將標籤放入框架中,並使用grid_propagate(False)似乎不起作用。 考慮下面的代碼:tkinter調整標籤寬度(grid_propagate不工作)

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,因爲窗口大小在函數重塑窗口時動態更改)
+0

好,但grid_propagate假阻止框架,以適應其子的大小。所以如果我禁用它的框架,並說'保持我給你的大小',並設置標籤粘'='SW'框架我應該得到我想要的? – simplynail

回答

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) 
     ... 

其次,您需要使用sticky屬性窗口放置時nest_frame使其膨脹,以填補它的空間:

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

太棒了,工作!感謝你用這種方式解釋它,而不是說'你最好以不同的方式來做......' - 真的很感激!這只是一個示例代碼,並且這種方法看起來像是進入正確應用程序的最佳方式。但是,我不認爲我需要'sticky ='我們'' - 我有columnpan = 4,因此它已經佔用了所有的寬度可用(或我?) – simplynail

+0

@simplynail:_「還是我?」_ - 試試看看。這裏有兩個概念:放置所有的空間,填充所有的空間。 –