2015-04-02 71 views
0

我正在使用ttk.Scrollbar滾動Tkinter.Canvas內的元素。不幸的是,這個畫布的背景圖像也會滾動。我怎樣才能防止這一點?如何防止畫布中的背景滾動?

下面是我用一個例子:

import Tkinter as tk 
from ttk import * 

# first canvas with scrollbar 
root = tk.Tk() 
canv1 = tk.Canvas(root, width=200, height=200, bg='green') 
sbar = Scrollbar(root, orient="vertical") 
sbar.config(command=canv1.yview) 
sbar.pack(side="right", fill="y")  
canv1.config(yscrollcommand=sbar.set) 
canv1.pack(side="right", fill="y") 

# background of dirst canvas 
photo_content2 = tk.PhotoImage(file = './sample_image.gif') 
canv1.create_image(115,300, image=photo_content2) 

# scrollable second canvas insode first 
canv2 = tk.Canvas(canv1, width=50, height=30, bg='red') 
canv2.pack() 
canv1.create_window(20,20, window=canv2) 
canv1.config(scrollregion=(0,0,300,1000)) 

root.mainloop() 

回答

1

滾動影響在畫布上繪製的一切。您無法添加不與其他所有內容一起滾動的背景圖片。這就是說,您可以創建一個函數,在滾動發生後移動背景圖像,並獲得與圖像不滾動相同的效果。

您可以通過將滾動條連接到自定義函數而不是直接連接到小部件yview和/或xview命令來完成此操作。在此功能中,您可以像平常那樣調用yviewxview命令,然後重新放置背景圖像。

例如,這是你將如何處理垂直滾動;水平滾動將以類似的方式工作:

def custom_yview(*args, **kwargs): 
    canvas.yview(*args, **kwargs) 
    x = canvas.canvasx(0) 
    y = canvas.canvasy(0) 
    canvas.coords("background", x,y) 

canvas = tk.Canvas(...) 
vsb = tk.Scrollbar(orient="vertical", command=custom_yview) 
canvas.create_image(..., tags=("background,"))