前一篇文章提供了封装之后的ScrollbarEx类,大大简化了Scrollbar控件的使用。但是这种做法并不是Tkinter想定的用法,Tkinter想定的方式是和其他控件绑定在一起使用。首先看动作视频:
首先构建一个标题为'ScrollListBox'的标签框控件。这个控件实在是太简单了,因此只是在这里顺便提一下。
frame1 = LabelFrame(root, text='ScrollListBox')
frame1.grid(row=0, column=0, columnspan=1, sticky=W+E)
构建一个列表框控件。
# create a listbox for demo.
lb = Listbox(frame1,
activestyle='dotbox',
height=8, width=20)
# add items
for i in range(0,20):
lb.insert(END, str(i))
# bind event
lb.bind('<<ListboxSelect>>',
lambda e: label.config(text=str(lb.curselection())))
lb.grid(row=0, column=0)
接下来是重点。代码首先构建一个垂直滚动条,并将command指定为Listbox的yview方法。参考前一篇说明的内容可以想象,yview方法中应该是对各种滚动通知的处理;在前一篇的处理中,当位置计算完成之后需要调用Scrollbar的set方法,这个set方法是通过代码指定给Listbox的yscrollcommand属性。
scroll_ly = Scrollbar(frame1, orient=VERTICAL, command=lb.yview)
scroll_ly.grid(row=0, column=1, sticky=N+S)
lb['yscrollcommand']=scroll_ly.set
同样的方法构建右侧的标签框:
frame2 = LabelFrame(root, text='ScrollText')
frame2.grid(row=0, column=1, columnspan=1, sticky=W+E+N+S)
构建文本控件。需要注意的是wrap属性被指定为NONE。
# create text widget.
text = Text(frame2, height = 10, width=20, wrap=NONE)
text.grid(row=0, column=0)
分别构建垂直和水平两个方向滚动条:
scroll_ty = Scrollbar(frame2, orient=VERTICAL, command=text.yview)
scroll_ty.grid(row=0, column=1, sticky=N+S)
text['yscrollcommand']=scroll_ty.set
scroll_tx = Scrollbar(frame2, orient=HORIZONTAL, command=text.xview)
scroll_tx.grid(row=1, column=0, sticky=E+W)
text['xscrollcommand']=scroll_tx.set
如果Text的wrap属性没有指定为NONE,则水平滚动条不会起作用。
完整代码可以从下面的链接下载:
https://github.com/xueweiguo/TkinterPrimer/blob/master/Sample/17%20Scrollbar.py
觉得本文有帮助?请分享给更多人。
阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】