我正在玩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()
方法将画布放在程序运行的窗口中时,滚动条是可见的但滚动条实际上并不起作用。任何有关这个问题的帮助都会受到欢迎。谢谢。
答案 0 :(得分:2)
问题在于您将pack
和grid
与两个共享同一父级的小部件混合在一起。你不能这样做。您需要始终使用一个或另一个用于共享同一父级的所有小部件。
一旦解决了这个问题,另一个问题就是你没有定义画布的哪个部分应该是可见的。您需要配置画布的scrollregion
。通常,您只需将滚动区域设置为包含画布上的所有内容。要获取画布上所有内容的边界框,您可以使用bbox
方法和特殊"all"
标记:
canvas1.configure(scrollregion=canvas1.bbox("all"))
如果您希望可滚动区域大于绘制的区域,请指定您想要的任何大小作为元组。您只需指定要显示的坐标即可。例如:
canvas1.configure(scrollregion=(0,0,10000,10000)