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技術文檔中心

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章