当程序达到一定规模后,经常会希望构建带滚动功能的控件。例如下图中的FileBrowser,无论是左侧的TreeView还是右侧的ListView都带有水平和垂直两个Scrollbar控件。
Tkinter中生成带有Scrollbar的控件的代码大致如下:
#生成Frame容器以容纳TreeView,Scrollbar
tree_area = Frame(paned_window)
# 设定水平伸展
tree_area.grid_rowconfigure(0, weight=1)
# 设定垂直伸展
tree_area.grid_columnconfigure(0, weight=1)
# 生成TreeView
tree_view = Treeview(tree_area, show='tree', selectmode='browse')
# 设定TreeView布局位置
tree_view.grid(row=0, column=0, sticky='nsew')
# 生成垂直滚动条
scroll_ty = Scrollbar(tree_area, orient=VERTICAL, command=tree_view.yview)
# 设定滚动条布局位置
scroll_ty.grid(row=0, column=1, sticky=N+S)
# 关联滚动动作
tree_view['yscrollcommand']=scroll_ty.set
# 生成水平滚动条
scroll_tx = Scrollbar(tree_area, orient=HORIZONTAL, command=tree_view.xview)
# 设定滚动条布局位置
scroll_tx.grid(row=1, column=0, sticky=E+W)
# 关联滚动动作
tree_view['xscrollcommand']=scroll_tx.set
逻辑虽然清晰,但是同样的事情多次重复总是比较麻烦,为此作者设计了如下的scrollable函数,用以简化此过程:
def scrollable(master, w_type, **kwargs):
# 获取SizeGrip设定内容
size_grip = kwargs.get('size_grip')
# 从关键词参数中去掉'size_grip'设定
if size_grip:
kwargs.pop('size_grip')
# 构建Frame控件
frame = Frame(master)
# 设定控件水平伸展
frame.grid_rowconfigure(0, weight=1)
# 设定控件垂直伸展
frame.grid_columnconfigure(0, weight=1)
# 构建控件
widget = w_type(frame, **kwargs)
# 设定控件布局
widget.grid(row=0, column=0, sticky='nsew')
# 构建垂直Scrollbar
scroll_y = Scrollbar(frame, orient=VERTICAL, command=widget.yview)
# 设定控件布局
scroll_y.grid(row=0, column=1, sticky=N + S)
# 绑定滚动动作
widget['yscrollcommand'] = scroll_y.set
# 构建水平Scrollbar
scroll_x = Scrollbar(frame, orient=HORIZONTAL, command=widget.xview)
# 设定控件布局
scroll_x.grid(row=1, column=0, sticky=E + W)
# 绑定滚动动作
widget['xscrollcommand'] = scroll_x.set
# 生成Sizegrip控件
if size_grip:
Sizegrip(frame).grid(row=1, column=1)
return frame,widget
虽然内容基本相同,只是进行了简单的封装,但产生的效果却很明显:构建同样的具有滚动功能的Treeview的代码从20多行变成了1行!
tree_area, tree_view = scrollable(paned_window, Treeview, show='tree', selectmode='browse')
还有一个好处是scrollable的使用根本无需了解Scrollbar的用法。
完整代码可以从以下地址下载:
https://github.com/xueweiguo/TkinterPrimer/blob/master/FileBrowser
觉得本文有帮助?请分享给更多人。
阅读更多更新文章,请关注微信公众号【面向对象思考】