2014-09-28 88 views
0

我正在玩弄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()方法放置在画布上的程序运行窗口,滚动条是可见的,但滚动条不实际工作。任何有关这个问题的帮助都会非常受欢迎。谢谢。

+0

为什么_are_使用'grid',而不是'pack'为'canvas1'? – abarnert 2014-09-28 11:02:35

+0

此代码取自所有添加的小部件已使用网格方法组织的代码的较大部分。 – sw123456 2014-09-28 11:03:49

+0

从http://effbot.org/tkinterbook/grid.htm:警告:切勿在同一个主窗口中混合网格和包。顺便说一句,对我来说,这有些作用(用“包”的画布)。我有一个滚动条,可以通过单击上/下框来移动框。然而,酒吧本身则充满了整个垂直空间。 – Jasper 2014-09-28 12:24:00

回答

2

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

一旦你解决了这个问题,另一个问题是你没有定义画布的哪一部分应该是可见的。您需要配置画布的scrollregion。大多数情况下,您只需将滚动区域设置为包含画布上的所有内容即可。为了得到一切的边框在画布上,你可以使用bbox方法与特殊"all"标签:

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

如果你想在滚动区域比什么已经绘就更大,指定你想要的任何大小一个元组。您只需指定想要显示的坐标。例如:

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

这是伟大的布莱恩,谢谢。我添加了您提供的代码,剩下的唯一问题是只有在窗口最小化为小于矩形图形时,滚动才会变为功能。即使将窗帘向下移动超过窗口限制,也不会使滚动功能生效。我究竟做错了什么?感谢你的宝贵时间。 – sw123456 2014-09-28 13:02:06

+0

@ sw123456:你没有做错任何事。这是预期的行为。如果您希望滚动条控制更大的区域,请告诉它您要滚动的区域。例如,如果您希望可滚动区域为10,000像素,请执行'canvas1.configure(scrollregion =(0,0,10000,10000))' – 2014-09-28 13:04:45

+0

此外,如果我在窗口上有更多小部件,并且我无法要使用.grid()方法来排列它们,如果我想要一个可滚动的画布,组装这些其他小部件的最佳方法是什么?.pack()方法似乎不容易组织小部件?谢谢。 – sw123456 2014-09-28 13:06:18