tkinter:无法让框架可滚动
在Python的tkinter中,我在一个Toplevel窗口里使用了两个不同的框架,一个在右边,另一个在左边。右边的框架是不能滚动的。我在这个框架上方创建了一个画布,然后在这个画布上再放了一个框架。我把这个画布设置成可以滚动,并且把一些小部件放在了这个画布上,但它还是不能滚动。我会附上可滚动部分的代码。
w1 = Canvas(frame2, width=600, height=300,background="white", scrollregion=(1500,1500,3000,3000))
scr_h1 = ttk.Scrollbar(frame2,orient=HORIZONTAL)
scr_h1.pack(side=BOTTOM,fill=X)
scr_h1.config(command=w1.xview)
scr_v1 = ttk.Scrollbar(frame2,orient=VERTICAL)
scr_v1.pack(side=RIGHT,fill=Y)
scr_v1.config(command=w1.yview)
w1.config(xscrollcommand=scr_h1.set,yscrollcommand=scr_v1.set)
w1.pack(fill=BOTH,expand=True)
1 个回答
2
这段代码在我使用Python 3.4时可以正常运行——会弹出一个tkinter窗口,里面有一个红色的椭圆(用于测试),而且滚动条可以让你在框架中移动。如果你使用的是Python 2,就把tkinter
改成Tkinter
(大写T)。
from tkinter import *
root = Tk()
frame2 = Frame(root)
frame2.pack(side=RIGHT)
w1 = Canvas(frame2, width=600, height=300,background="white", scrollregion=(0,0,3000,3000))
scr_h1 = Scrollbar(frame2,orient=HORIZONTAL)
scr_h1.pack(side=BOTTOM,fill=X)
scr_h1.config(command=w1.xview)
scr_v1 = Scrollbar(frame2,orient=VERTICAL)
scr_v1.pack(side=RIGHT,fill=Y)
scr_v1.config(command=w1.yview)
w1.config(xscrollcommand=scr_h1.set,yscrollcommand=scr_v1.set)
w1.pack(fill=BOTH,expand=True)
# inserted to see if it's actually scrolling
w1.create_oval(0,0,50,50,fill='red')
root.mainloop()
可能存在的两个问题
- 你为什么要使用ttk滚动条?其实简单的tkinter滚动条就足够用了。当代码出现问题时,回归到更简单的模型可能会有所帮助。
- 你为什么把起始滚动区域设为1500?在这个设置下,放在画布上前1500个单位内的任何对象都看不见,这可能让你觉得滚动条没有工作。想了解更多关于使用滚动条的信息,可以查看http://effbot.org/zone/tkinter-scrollbar-patterns.htm。
有两个框架或它们的排列方式应该不影响程序的运行,不过如果你尝试混合使用不同的管理器(比如grid、pack等),可能会遇到问题。这些问题通常是程序卡住,而不是滚动条不动。