2016-11-09 55 views
2

我正在使用標籤來顯示數據。然而,我有這麼多的標籤放置在彼此之下,我不能讓他們都在同一個窗口。我希望使用滾動條滾動標籤。不過,據我所知,這並不是那麼簡單。據我所知,我最好的選擇是使用框架來收集我的所有標籤,然後將框架插入到畫布中,然後可以與滾動條平行使用,儘管我在這方面遇到了麻煩。 ,我使用創建我的標籤功能是如何使用嵌入畫布中的框架內的地方?

def Tab(root, y): 
    #Print the team 
    playerTeam = Label(root, bg = "white", text = "Hello") 
    playerTeam.config(height = 1, width = 13) 
    playerTeam.place(x=20,y=y) 

我試圖用我的功能

def onFrameConfigure(canvas): 
    '''Reset the scroll region to encompass the inner frame''' 
    canvas.configure(scrollregion=canvas.bbox("all")) 

root = tk.Tk() 
root.geometry("400x400") 
canvas = tk.Canvas(root, borderwidth=0, background="#ffffff") 
frame = tk.Frame(canvas, background="#ffffff") 
vsb = tk.Scrollbar(root, orient="vertical", command=canvas.yview) 
canvas.configure(yscrollcommand=vsb.set) 

vsb.pack(side="right", fill="y") 
canvas.pack(side="left", fill="both", expand=True) 
canvas.create_window((4,4), window=frame, anchor="nw") 

frame.bind("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas)) 

Tab(frame, 20) 

運行時,產生一個空白窗口中添加以下代碼結合。 但是,當使用.grid代替.place時,在Tab()中它正常工作,並且標籤顯示在窗口上。儘管當我多次調用Tab()時,標籤將從窗口中移出,並且向下滾動的功能不可用。

我怎樣才能讓.place函數正常工作。 其次我怎樣才能讓滾動條正常工作。 謝謝

回答

0

問題是place不像其他幾何管理器一樣工作 - 它不會改變其父項的大小。因此,即使您在框架中放置了一個大(ish)標籤,該框架仍然保持其默認尺寸爲一個像素寬和一個像素高。它在那裏,你看不到它。

您可以通過給幀一個明確的寬度和高度驗證這一點(並加入獨特的色彩有助於進行可視化,太):

frame.configure(width=100, height=100, background="bisque") 

official documentation for place

不像許多其他幾何管理器(例如打包器)放置器 不會嘗試操縱主窗口或從窗口的父窗口的幾何圖形(即,它不會設置它們的 請求的大小)。要控制這些窗口的大小,請使窗口像框架和畫布一樣爲此提供配置選項 。

我強烈建議您使用place。 Tkinter的packgrid幾何管理器非常擅長佈置小部件。如果使用place,則必須自己進行大量的數學計算,結果可能無法正確調整大小,或者無法承受大量工作而承受分辨率或字體大小的變化。

+0

感謝Bryan,但我確實無法看到網格和包幾何管理器與我的界面設計很好地配合。但是另外,爲什麼滾動條在我給出的例子中不起作用? –

+0

滾動條不起作用,因爲'scrollregion'沒有設置,因爲框架很小。將'scrollregion'設置爲大於畫布的值,並且滾動條將起作用。我敢打賭,幾乎沒有任何界面設計可以滿足,不能使用'pack'或'grid',除了需要用戶能夠交互移動小部件的設計之外。 –

+0

好的謝謝。但是,我可以使用包/網格方法,但是此時我發現很難將標籤放在我想要的位置,而沒有將標籤設置得太緊密。 –

相關問題