Tkinter教程之Scrollbar篇

'''Tkinter教程之Scrollbar篇'''
#Scrollbar(滚动条),可以单独使用,但最多的还是与其它控件(Listbox,Text,Canva等)结合使用
'''1.创建一个Scrollbar'''
from Tkinter import *
root = Tk()
Scrollbar(root).pack()
root.mainloop()
#显示了一个Scrollbar,但什么也做不了,无法拖动slider。
from Tkinter import *
root = Tk()
sl = Scrollbar(root)
sl.set(0.5,0)
sl.pack()
root.mainloop()
'''2.通过set方法来设置slider的位置'''
#使用水平滚动条,通过set将值设置为(0.5,1),即slider占整个Srollbar的一半
from Tkinter import *
root = Tk()
sl = Scrollbar(root,orient = HORIZONTAL)
sl.set(0.5,1)
sl.pack()
root.mainloop()
'''3.使用回调函数(不建议这样使用)'''
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
def scrollCall(moveto,pos):
    #如何得到两个参数:使用如下打印中的信息,可以看到解释器传给scrollCall函数的两个参数,一个为
    #moveto,参考手册可以得知,它是当拖动slider时调用的函数;另一个参数为slider的当前位置,我们
    #可以通过set函数来设置slider的位置,因此使用这个pos就可以完成控制slider的位置。
    #print moveto,pos
    sl.set(pos,0)
    print sl.get()
sl = Scrollbar(root,orient = HORIZONTAL,command = scrollCall)
sl.pack()
root.mainloop()
#这样还有一个严重问题,只能对其进行拖动。对两个按钮及pagedwon/pageup的响应,由于up按钮响应的为三个参数,故会出
#现异常。这个例子只是用来说明command属性是可用的,如果喜欢自己可以处理所有的消息,将scrollCall是否可以改为变参数函数?
#对于不同的输入分别进行不同的处理。

'''4.单独使用还是比较少见,大部分应用还是与其它控件的绑定,以下是将一个Listbox与Scrollbar绑定的例子'''
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
lb = Listbox(root)
sl = Scrollbar(root)
sl.pack(side = RIGHT,fill = Y)
#side指定Scrollbar为居右;fill指定填充满整个剩余区域,到WM在时候再详细介绍这几个属性。
#下面的这句是关键:指定Listbox的yscrollbar的回调函数为Scrollbar的set
lb['yscrollcommand'] = sl.set
for i in range(100):
    lb.insert(END,str(i))
#side指定Listbox为居左
lb.pack(side = LEFT)
#下面的这句是关键:指定Scrollbar的command的回调函数是Listbar的yview
sl['command'] = lb.yview
root.mainloop()
'''5.这样理解二者之间的关系:当Listbox改变时,Scrollbar调用set以改变slder的位置;当Scrollbar改变了slider的位置时,Listbox调用yview以显示新的list项,为了演示这两种关系先将yscrollcommad与scrollbar的set解除绑定,看看会有什么效果'''
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
lb = Listbox(root)
sl = Scrollbar(root)
sl.pack(side = RIGHT,fill = Y)
#解除Listbox的yscrollcommand与Scrollbar的set绑定
#lb['yscrollcommand'] = sl.set
for i in range(100):
    lb.insert(END,str(i))
#使用索引为50的元素可见
lb.see(50)
lb.pack(side = LEFT)
sl['command'] = lb.yview
root.mainloop()
#运行结果,Listbox显示了50项,即Listbox的视图已经到50了,但Scrollbar的slider仍旧位于0处。也就是说Scroolbar没有收到set
#的命令。即说明解除此绑定,Scrollbar将不再响应Listbox视图改变的消息。但仍可以使用Scrollbar的slider来移动Listbox的视图。

'''6.再测试一下,解除Scrollbar的command与Listbox的yview的关系,测试代码如下:'''
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
lb = Listbox(root)
sl = Scrollbar(root)
sl.pack(side = RIGHT,fill = Y)
#下面的这句是关键:指定Listbox的yscrollbar的回调函数为Scrollbar的set
lb['yscrollcommand'] = sl.set
for i in range(100):
    lb.insert(END,str(i*100))
#使用索引为50的元素可见
lb.see(50)
lb.pack(side = LEFT)
#解除Scrollbar的command与Listbox的yview的关系
#sl['command'] = lb.yview
root.mainloop()
#运行程序,Scrollbar的slider已经到了50位置,也就是说Scrollbar响应了Listbox视图改变的消息,调用 了自己的set函数。
#进行操作:拖动slder或点击up/down按钮,Listbox的视图没有任何反应,即Listbox不会响应Scrollbar的消息了。


原文

chinaunix的Python技术文档中心

以下是一个简单的示例代码,可以实现在Tkinter窗口中使用Scrollbar滚动显示图片: ```python from tkinter import * from PIL import Image, ImageTk class ScrollableImage(Frame): def __init__(self, master=None, **kw): self.image = kw.pop('image', None) self.width = kw.pop('width', None) self.height = kw.pop('height', None) self.bg_color = kw.pop('bg_color', None) super().__init__(master, **kw) self.canvas = Canvas(self, highlightthickness=0, bg=self.bg_color) self.canvas.pack(side=LEFT, fill=BOTH, expand=TRUE) self.scrollbar = Scrollbar(self, orient=VERTICAL, command=self.canvas.yview) self.scrollbar.pack(side=RIGHT, fill=Y) self.canvas.config(yscrollcommand=self.scrollbar.set) self.canvas.bind('<Configure>', self.__on_canvas_configure) self.container = Frame(self.canvas, bg=self.bg_color) self.canvas.create_window((0, 0), window=self.container, anchor=NW) self.container.bind('<Configure>', self.__on_container_configure) if self.image: self.set_image(self.image) def set_image(self, image): self.image = Image.open(image) self.photo = ImageTk.PhotoImage(self.image.resize((self.width, self.height), Image.ANTIALIAS)) self.canvas.config(scrollregion=self.canvas.bbox(ALL)) self.image_canvas = self.container.create_image(0, 0, anchor=NW, image=self.photo) def __on_canvas_configure(self, event): self.canvas.itemconfigure(self.image_canvas, width=event.width) def __on_container_configure(self, event): self.canvas.config(scrollregion=self.canvas.bbox(ALL)) if __name__ == '__main__': root = Tk() image_path = 'your_image_path.jpg' image_width = 800 image_height = 600 frame = Frame(root) frame.pack(side=TOP, fill=BOTH, expand=TRUE) scrollable_image = ScrollableImage(frame, width=image_width, height=image_height, bg_color='white') scrollable_image.pack(side=LEFT, fill=BOTH, expand=TRUE) scrollable_image.set_image(image_path) root.mainloop() ``` 在上面的示例中,我们使用了Pillow库中的ImageTk类来将图片转换为Tkinter中的PhotoImage格式,然后使用Canvas和Scrollbar来实现滚动显示图片的功能。在ScrollableImage类中,我们使用了Canvas的yscrollcommand属性来绑定Scrollbar的滚动事件,然后使用Canvas的create_window方法将一个Frame作为Canvas的子控件添加到Canvas中。在该Frame上添加图片,并绑定Canvas和该Frame的resize事件,以便在窗口大小发生变化时更新滚动范围。最后,在主函数中创建一个ScrollableImage实例并设置图片路径、宽度和高度等参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值