2015-04-02 72 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,"))