本文介绍另一个控件Scrollbar,在tkinter-Text详解一文中有提到过Scrollbar,但是没有做过多的说明。因此本文将详解Scrollbar及其使用场景。

文章目录

  • Scrollbar
    • element
    • orient
    • activebackground
    • background
    • cursor
    • jump
    • repeatdelay
    • repeatinterval
    • takefocus
    • command
    • set()
    • 什么是可滚动控件?
    • scrollbar和可滚动控件的关系?
    • scrollbar与可滚动控件的绑定

Scrollbar

Scrollbar 一般和其他控件联合使用,当被显示的控件的内容大于可显示区域时,使用Scrollbar可显示更多的内容。一般垂直滚动条(vertical scrollbar)和Listbox, Text and Canvas联合使用;水平滚动条(horizontal scrollbar)也可作用于Entry。

首先还是介绍Scrollbar的常用属性和方法,最后再举几个结合其他控件的实例。

element

scrollbar的5个elements

arrow1,arrow2 指滚动条两端的箭头

slider 指scrollbar中的滑块

trough1,trough2 指非slider区域,可以称为

可通过slider拖动来改变视图,也可点击 arrow1或arrow2来改变视图,也可点击 trough1或trough2来改变视图。所谓视图,简单讲就是滑块的位置发生了改变,相应的显示内容也跟着变化。

orient

滚动条方向属性,通常有两个值"vertical"(默认值)和"horizontal"。即垂直滚动条和水平滚动条。

# bar = Scrollbar(main_win, orient=VERTICAL)
bar = Scrollbar(main_win, orient=HORIZONTAL)
bar.pack()

activebackground

当鼠标在滑块(slider)或箭头(arrowhead)上时,显示的背景颜色。windows上实测无效。

bar = Scrollbar(main_win, activebackground='red')
bar.pack()

background

指定背景颜色。window上实测无效

bar = Scrollbar(main_win, background='red')
bar.pack()

cursor

指定光标样式

bar = Scrollbar(main_win, cursor='cross')
bar.pack()

jump

控制用户拖动滑块时发生的动作。默认(jump=0)每拖动一次滑块,就会使command指定的回调函数被调用。如果jump=1,回调函数只在用户放开鼠标按键时被调用一次,在拖动过程中不会被触发。windows上实测无效。

repeatdelay

延迟x秒移动滑块。鼠标左键按下x秒数后,滑块在某个方向开始持续移动。通常用于滚动条中的向上和向下的箭头。windows上实测无效。

repeatinterval

一旦滑块在某方向的持续移动开始,repeatinterval决定了相邻两次移动动作的时间间隔, 一般和repeatdelay联合使用。windows上实测无效。

takefocus

可以使用tab键将焦点切换到scrollbar。如果takefocus=0,那么将关闭该功能。

command

对于scrollbar非常重要的交互属性。通常用于指定可滚动控件(scrollable widget)的xview或yview函数。

因为滚动条有两种动作: ‘moveto’和’scroll’,'moveto’对应slider的拖动,'scroll’对应arrow或trough的点击。我们来看看怎样指定command对应的回调函数。

from tkinter import (Tk, Text, Scrollbar)
from tkinter.constants import (HORIZONTAL, VERTICAL, RIGHT, LEFT, X, Y, BOTH, BOTTOM, YES)def cb():print('first cb')main_win = Tk()
main_win.title('渔道的Scrollbar控件')
main_win.geometry(f'{800}x{800}')# create Scrollbar
scrollbar_v = Scrollbar(main_win)
scrollbar_v.pack(side=RIGHT, fill=Y)
scrollbar_h = Scrollbar(main_win, orient=HORIZONTAL)
scrollbar_h.pack(side=BOTTOM, fill=X)
text = Text(main_win, width=40, height=40)
text.config(yscrollcommand=scrollbar_v.set)
text.pack(expand=YES,fill=BOTH)
for i in range(1, 1000):text.insert(f'{i}.0', f'line:{str(i)}\n')scrollbar_v.config(command=cb)main_win.mainloop()

运行上面的代码会出现如下界面:

当我拖动slider时,报错TypeError: cb() takes 0 positional arguments but 2 were given

当我点击arrow或trough时,报错TypeError: cb() takes 0 positional arguments but 3 were given

说明scrollbar内部在调用回调函数cb()时,会给它传递参数。拖动slider时,传递了两个参数;点击arrow或trough时,传递了三个参数。显然,要想使用一个回调函数来处理这两种事件,那么就需要给回调函数指定可变参数(即可传入2个参数也可传入3个参数),我们知道python的函数时支持这种语法的,实现起来非常容易。

可以将cb()改成如下代码:

def cb(*args):argc = len(args)if argc == 2:print(f'{args[0]}, {args[1]},drag slider...')elif argc == 3:print(f'{args[0]}, {args[1]}, {args[2]},hit arrow...')else:print('invalid parameters number')

再次运行修改后的程序,

拖动slider,可以看到如下打印信息moveto, 0.0235,drag slider...

点击arrow或trough,可以看到如下打印信息scroll, 1, units,hit arrow...

通过上述实践过程,可以得到如下结论:

  1. 拖动slider(对应’moveto’事件)时,触发command指定的回调函数,该回调函数有2个参数cb1(action, fraction)
  2. 点击arrow或trough(对应’scroll’事件)时,触发command指定的回调函数,该回调函数有3个参数cb2(action,number,pages)
  3. 可以通过可变参数将回调函数接口统一

已知scrollbar.config(command=text.yview)支持对slider、arrow、trough的响应,为什么呢?原因就在于类XView,YView
为了接口统一,在tkinter中 创建了类XView,YView, 在YView中,定义了函数yview(*args),这样text就可以支持’moveto’和’scroll’。与我们前面定义的cb(*args)本质上是一样的。

set()

set(first, last)

设置scrollbar的slider的位置,通常作为可滚动控件的回调函数。first和last的值的范围是[0,1]的小数,first到last的区间指定了与scrollbar绑定的可滚动控件的可视内容的范围。

在tkinter-Text详解一文的给Text加上滚动条一节的实例中,细心的同学可能发现了这样一个问题:无论是拖动slider还是点击arrow1、arrow2还是点击trough1、trough2,视图都没有发生变化;但是将鼠标放在Text区域,上下滚动鼠标滚轮,发现视图发生变化而且slider也跟着变化。接下来,会细品该问题背后的原因。

什么是可滚动控件?

class Text(Widget, XView, YView)
class Listbox(Widget, XView, YView)
class Entry(Widget, XView)
class Canvas(Widget, XView, YView)
class Spinbox(Widget, XView)

Text,Listbox,Entry,Canvas,Spinbox都是可滚动控件。也就是说继承于XView和(或)YView的控件类都是可滚动控件。

scrollbar和可滚动控件的关系?

scrollbar控件不是作为其他可滚动控件的一部分,两者之间只是组合关系,而不是包含关系。

scrollbar与可滚动控件的绑定

scrollbar和可滚动控件 之间的绑定是相互的,scrollbar既要主动绑定可滚动控件的相关函数,可滚动控件也要主动绑定scrollbar的相关函数。
例如,scrollbar.config(command=text.yview),text.config(yscrollcommand=scrollbar.set)
如果只绑定了scrollbar.config(command=text.yview),那么只有对滚动条进行操作(drag slider,点击arrow,trough)时,text的视图才会随着变动;而对text进行操作(滚动鼠标滚轮)时,滚动条视图(slider)不会跟着变化
如果只绑定了text.config(yscrollcommand=scrollbar.set),那么只有对text进行操作(滚动鼠标滚轮)时,滚动条视图才会跟着变化;而对滚动条(scrollbar)进行操作(drag slider,点击arrow,trough)时,text的视图不会随着变动
所以,只有对 scrollbar和可滚动控件 相互绑定,才能实现操作任一种控件,两者视图都会同步变化.

from tkinter import (Tk, Text, Scrollbar)
from tkinter.constants import (HORIZONTAL, VERTICAL, RIGHT, LEFT, X, Y, BOTH, BOTTOM, YES)main_win = Tk()
main_win.title('渔道的Scrollbar控件')
main_win.geometry(f'{800}x{800}')scrollbar_v = Scrollbar(main_win)
scrollbar_v.pack(side=RIGHT, fill=Y)
scrollbar_h = Scrollbar(main_win, orient=HORIZONTAL)
scrollbar_h.pack(side=BOTTOM, fill=X)
text = Text(main_win, width=40, height=40)
text.config(yscrollcommand=scrollbar_v.set) # text绑定垂直滚动条
text.config(xscrollcommand=scrollbar_h.set) # text绑定水平滚动条
text.pack(expand=YES,fill=BOTH)
for i in range(1, 1000):text.insert(f'{i}.0', f'line:{str(i)}\n')scrollbar_v.config(command=text.yview) # 垂直滚动条绑定text
scrollbar_h.config(command=text.xview) # 水平滚动条绑定textmain_win.mainloop()

读者可以执行上述代码来 体验实际的效果。无法用语言描述。

tkinter-Scrollbar详解相关推荐

  1. Tkinter 组件详解(九):Scrollbar

    Tkinter 组件详解之Scrollbar Scrollbar(滚动条)组件用于滚动一些组件的可见范围,根据方向可分为垂直滚动条和水平滚动条.Scrollbar 组件常常被用于实现文本.画布和列表框 ...

  2. Tkinter组件详解(五):Listbox和Scrollbar

    Tkinter组件详解之Listbox Listbox(列表框)组件用于显示一个选择列表.Listbox 只能包含文本项目,并且所有的项目都需要使用相同的字体和颜色.根据组件的配置,用户可以从列表中选 ...

  3. Tkinter 组件详解(十):Scale

    Tkinter 组件详解之Scale Scale(刻度)组件看起来像是一个带数据的 Scrollbar(滚动条)组件,但事实上它们是不同的两个东东.Scale 组件允许用于通过滑动滑块来选择一个范围内 ...

  4. Tkinter 组件详解(七):Entry

    Tkinter 组件详解之Entry Entry(输入框)组件通常用于获取用户的输入文本. 何时使用 Entry 组件? Entry 组件仅允许用于输入一行文本,如果用于输入的字符串长度比该组件可显示 ...

  5. Tkinter 组件详解(八):Listbox

    Tkinter 组件详解之Listbox Listbox(列表框)组件用于显示一个选择列表.Listbox 只能包含文本项目,并且所有的项目都需要使用相同的字体和颜色.根据组件的配置,用户可以从列表中 ...

  6. Tkinter 组件详解(一):Label

    Tkinter 组件详解之Label Label(标签)组件用于在屏幕上显示文本或图像.Label 组件仅能显示单一字体的文本,但文本可以跨越多行.另外,还可以为其中的个别字符加上下划线(例如用于表示 ...

  7. Tkinter 组件详解(五):Frame

    Tkinter 组件详解之Frame Frame(框架)组件是在屏幕上的一个矩形区域.Frame 主要是作为其他组件的框架基础,或为其他组件提供间距填充. 何时使用 Frame 组件? Frame 组 ...

  8. Tkinter 组件详解(四):Radiobutton

    Tkinter 组件详解之Radiobutton Radiobutton(单选按钮)组件用于实现多选一的问题.Radiobutton 组件可以包含文本或图像,每一个按钮都可以与一个 Python 的函 ...

  9. Python Tkinter模块详解(后续持续补充)

    声明:该文章是个人学习中写的,目的是总结及当作工具参考,有一定的借鉴成分,后续若有新发现则补充 目录 Tkinter简介 创建组件基本语法 Tkinter组件汇总 Variable 类 常见参数详解 ...

  10. tkinter库详解

    ①导入标准库(tkinter为python标准库无需安装) from tkinter import * ②窗口的创建和设置 窗口的创建和设置方法 注释 root=Tk() 生成主窗口 root.geo ...

最新文章

  1. iOS和OS X中的bundle
  2. 矩阵相乘取共轭_正交矩阵学习小结
  3. SpringCloud 定义Eureka服务端、Eureka服务信息、Eureka发现管理、Eureka安全配置、Eureka-HA机制、 Eureka服务打包部署
  4. 生产库自动派送报表派送失败之重新派送
  5. pythonspark实践_基于Python的Spark Streaming Kafka编程实践
  6. STM32F103:一.(4)JWAG功能IO复用
  7. 基于matlab的gps信号仿真123,MATLABGPS信号仿真完整源代码.doc
  8. 使用CSS按比例调整图像大小? [重复]
  9. js调用html页面跳转,js实现页面跳转的方法
  10. 成熟的软件资产管理——license管理
  11. 证件照换底色,快速简单!(附去水印宝藏工具)
  12. CEF 、chromium源码下载前相关代理配置
  13. 使用二维数组和函数解决八皇后问题(c++)
  14. Mysql 常用 时间函数
  15. Python常见习题
  16. 联想拯救者系统重装?不求人教程
  17. 转到计算机科学与技术专业的申请书,转专业的申请书范文(精选5篇)
  18. 揭秘蓝牙定位技术,实现精准室内导航
  19. 光大证券自称因异常交易损失约1.94亿元,疑为程序问题!
  20. 缺陷的定义以及怎样编写缺陷报告

热门文章

  1. 经验:《王者荣耀》技术总监分享背后技术
  2. AI讲话总爱“结巴”?这篇NeurIPS论文找到了病因,结巴率已接近人类!
  3. 【三傻大闹宝莱坞】有感
  4. 核心交换机、汇聚交换机是什么
  5. 软件的设计之生生不息
  6. 汽车电子的KL30 KL50 KLR
  7. 电脑桌面图标全部变成Word图标?
  8. vue使用history模式页面空白
  9. Python是什么 它有哪些优点
  10. PS画布基本操作 新建保存 图片类型区分设置