2017-02-14 118 views
1

我發現與此相關的幾個問題和答案,但沒有任何解決方案都會使我明白爲什麼這個代碼不工作:Tkinter的帆布和滾動條

root=tk.Tk() 

vscrollbar = tk.Scrollbar(root) 

c= tk.Canvas(root,background = "#D2D2D2",yscrollcommand=vscrollbar.set) 

vscrollbar.config(command=c.yview) 
vscrollbar.pack(side=tk.LEFT, fill=tk.Y) 

f=tk.Frame(c) #Create the frame which will hold the widgets 

c.pack(side="left", fill="both", expand=True) 
c.create_window(0,0,window=f) 

testcontentA = tk.Label(f,wraplength=350 ,text=r"Det er en kendsgerning, at man bliver distraheret af læsbart indhold på en side, når man betragter dens websider, som stadig er på udviklingsstadiet. Der har været et utal af websider, som stadig er på udviklingsstadiet. Der har været et utal af variationer, som er opstået enten på grund af fejl og andre gange med vilje (som blandt andet et resultat af humor).") 
testcontentB = tk.Button(f,text="anytext") 
testcontentA.pack() 
testcontentB.pack() 

f.pack() 

c.config(scrollregion=c.bbox("all")) 

root.mainloop() 

我有一個動態生成的內容一個Tkinter的窗口 - 這意味着如果屏幕上顯示兩個許多小部件,就需要能夠向下滾動。我希望能夠使用小部件填充框架'f',然後使用canvas.create_window()函數以可滾動的方式顯示它。

現在顯示窗口,但滾動條未啓用 - 它像滾動區域不正確或滾動條和畫布之間的鏈接不正確。

回答

1

如果要在畫布中嵌入幀,則必須使用create_window而不是pack。第一步是刪除f.pack()。第二,你需要在之後設置bbox tkinter有機會顯示小部件,因爲它們的大小隻有在它們實際繪製在屏幕上之前才能計算出來。

完成該操作的簡單方法是在致電c.config(scrollregion=c.bbox("all"))之前致電root.update(),或安排使用after_idle運行該命令。

你的代碼中的另一個錯誤(我假設...)是你在(0,0)創建窗口,但不設置錨點。這意味着當我猜你想讓左上角處於(0,0)時,內部框架將以(0,0)爲中心。

更改create_window調用這個樣子:

c.create_window(0,0,window=f, anchor='nw') 
+0

這太棒了 - 非常感謝!我會測試這個並回來 – user3535074

0
import tkinter as tk 

root=tk.Tk() 

vscrollbar = tk.Scrollbar(root) 

c= tk.Canvas(root,background = "#D2D2D2",yscrollcommand=vscrollbar.set) 

vscrollbar.config(command=c.yview) 
vscrollbar.pack(side=tk.LEFT, fill=tk.Y) 

f=tk.Frame(c) #Create the frame which will hold the widgets 

c.pack(side="left", fill="both", expand=True) 

#Updated the window creation 
c.create_window(0,0,window=f, anchor='nw') 

#Added more content here to activate the scroll 
for i in range(100): 
    tk.Label(f,wraplength=350 ,text=r"Det er en kendsgerning, at man bliver distraheret af læsbart indhold på en side, når man betragter dens websider, som stadig er på udviklingsstadiet. Der har været et utal af websider, som stadig er på udviklingsstadiet. Der har været et utal af variationer, som er opstået enten på grund af fejl og andre gange med vilje (som blandt andet et resultat af humor).").pack() 
    tk.Button(f,text="anytext").pack() 

#Removed the frame packing 
#f.pack() 

#Updated the screen before calculating the scrollregion 
root.update() 
c.config(scrollregion=c.bbox("all")) 

root.mainloop() 

感謝布賴恩·奧克利的偉大答案。

0

這很容易,你將c.create存儲在一個元組中!

from tkinter import * 
root = Tk() 
c = Canvas(root, width=500, height=400).pack() 
scroll = c.create_rectangle(225,175,175,225,fill='black'),c.create_rectangle(225,175,275,225) 
while True: 
     x1 = 1 
     c.move(scroll,x1,0) 
canvas.mainloop()