如何防止画布中的背景滚动?

时间:2015-04-02 09:45:26

标签: python image background tkinter scrollbar

我正在使用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 个答案:

答案 0 :(得分: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,"))