将滚动条应用于Tkinter中的画布小部件的问题

时间:2014-09-28 10:57:56

标签: python tkinter

我正在玩Tkinter小部件,我正在尝试将滚动条应用到画布小部件,但是当程序运行时它会挂起 - 没有错误消息等。

首先是附加滚动条的一般逻辑吗?

其次,问题似乎是.pack()方法,因为删除它允许程序运行。因为我使用了.grid()方法,这意味着我还必须使用.grid()方法进行滚动?如果是这样,怎么能实现呢?任何帮助实现这一目标都将受到极大的重视。提前感谢您的时间。

from tkinter import *

x = 10
y = 10
a = 100
b = 100

def change_coord(event):
        global coord
        if event.keysym == 'Up':
            coord[1] -=1
            coord[3] -=3
        if event.keysym == 'Down':
            coord[1] +=1
            coord[3] +=3
        if event.keysym == 'Right':
            coord[0] +=1
            coord[2] +=3
        if event.keysym == 'Left':
            coord[0] -=1
            coord[2] -=3
        canvas1.coords(arc, *coord)


window = Tk()
window.geometry("500x500")


#canvas scroll bar
scrollbar = Scrollbar(window)
scrollbar.pack(side=RIGHT, fill=Y)

#canvas and drawing
canvas1=Canvas(window, yscrollcommand=scrollbar.set, height = 200, width = 400)
canvas1.grid(row=0, column=0, sticky=W)
coord = [x, y, a, b]
arc = canvas1.create_rectangle(*coord, outline="#fb0", fill="#fb0")

#canvas scrollbar continued
scrollbar.config(command=canvas1.yview)

#captureing keyboard inputs and assigning to function
window.bind_all('<Up>', change_coord)
window.bind_all('<Down>', change_coord)
window.bind_all('<Left>', change_coord)
window.bind_all('<Right>', change_coord)
window.mainloop()

另外,我看到当我使用.pack()方法将画布放在程序运行的窗口中时,滚动条是可见的但滚动条实际上​​并不起作用。任何有关这个问题的帮助都会受到欢迎。谢谢。

1 个答案:

答案 0 :(得分:2)

问题在于您将packgrid与两个共享同一父级的小部件混合在一起。你不能这样做。您需要始终使用一个或另一个用于共享同一父级的所有小部件。

一旦解决了这个问题,另一个问题就是你没有定义画布的哪个部分应该是可见的。您需要配置画布的scrollregion。通常,您只需将滚动区域设置为包含画布上的所有内容。要获取画布上所有内容的边界框,您可以使用bbox方法和特殊"all"标记:

canvas1.configure(scrollregion=canvas1.bbox("all"))

如果您希望可滚动区域大于绘制的区域,请指定您想要的任何大小作为元组。您只需指定要显示的坐标即可。例如:

canvas1.configure(scrollregion=(0,0,10000,10000)