Python--詳解TKinter類庫

  • 爲了學習python3.5的tkinter,因而我去官網找了找相關部件的一些文檔,讀起來有點繞口,以爲仍是本身來實踐實踐,看看視頻感受用處會更大,而後就有了下面的一部分經常使用的總結,
  • 查看tkinter類庫發現它主要是分爲兩個部分,一個是Widget classes(部件類),另外一個是Mixins(多重繼承,也有人說是混入)。首先咱們來介紹一下Widget classes(部件類)。

  • 主要參考資料:python中tkinter庫中的pack方法中optinon選項含義:http://www.cnblogs.com/zhangpengshou/p/3626137.html
  • Widget classes()
    •   Button Widget
      •   Button就像是一個按鈕鍵,它的下面通常是藏着各類方法用來實現python的必定的功能,咱們能夠經過給Button寫一個text的內容就會實現一個東西了。
      •   Button中的一些樣式
         1 #coding=gbk
         2 from tkinter import *
         3 master =Tk()
         4 def callback():
         5     print('click!')
         6 #最普通的返回操做,按鈕返回一個值(經過一個函數傳遞)
         7 #b=Button(master,text='OK',command=callback)
         8 
         9 #DISABLED  state狀態    表示不能按下這個按鈕,沒法操做這個按鈕
        10 #b = Button(master, text="Help", state=DISABLED)
        11 
        12 #當你不設置大小的時候,按鈕能容納全部東西;固然你也能夠指定大小:padx,pady
        13 #b = Button(master, text="Help", state=DISABLED,padx=59,pady=99)
        14 
        15 #固然咱們也能夠在按鈕裏面在寫入一個窗體,窗體通常是用像素來表示的,因此按鈕也是能夠按照像素來進行表示的,位圖也是能夠的
        16 # f = Frame(master, height=320, width=320)
        17 # f.pack_propagate(0) # don't shrink
        18 # f.pack()
        19 # b = Button(f, text="Sure!")#將窗體導入
        20 # b.pack(fill=BOTH, expand=1)#填充頂部,擴展
        21 
        22 #當text有多行的時候
        23 #b = Button(master, text='longtext阿士大夫撒旦法士大夫撒旦法', anchor=W, justify=LEFT, padx=2)
        24 
        25 #這個操做是讓按鈕好像已經按下去了可是實際上沒有觸發按鈕的功能,再點擊就能觸發
        26 #b.config(relief=SUNKEN)
        27 
        28 #b = Checkbutton(master, image=, variable='var', indicatoron=0)
        29 #b = Button(master, text="Click me", image='pattern', compound=CENTER)
        30 
        31 
        32 b.pack()
        33 
        34 mainloop()
        View Code
      •   Button中的窗口部件的選項
         1 #coding=gbk
         2 
         3 activebackground, activeforeground:當按鈕被激活時所使用的顏色
         4 anchor:控制按鈕上內容的位置。使用N, NE, E, SE, S, SW, W, NW, or CENTER這些值之一。默認值是CENTER。
         5 background (bg), foreground (fg):按鈕的顏色。默認值與特定平臺相關。
         6 bitmap:顯示在窗口部件中的位圖。若是image選項被指定了,則這個選項被忽略。下面的位圖在全部平臺上都有 效:error, gray75, gray50, gray25, gray12, hourglass, info, questhead, question, 和 warning.
         7 
         8 borderwidth (bd):按鈕邊框的寬度。默認值與特定平臺相關。但一般是1或2象素。
         9 command:當按鈕被按下時所調用的一個函數或方法。所回調的能夠是一個函數、方法或別的可調用的Python對象。
        10 cursor:當鼠標移動到按鈕上時所顯示的光標。
        11 default:若是設置了,則按鈕爲默認按鈕。
        12 disabledforeground:當按鈕無效時的顏色。
        13 image:在部件中顯示的圖象。若是指定,則text和bitmap選項將被忽略。
        14 justify:定義多行文本如何對齊。可取值有:LEFT, RIGHT, 或 CENTER。
        15 padx, pady:指定文本或圖象與按鈕邊框的間距。
        16 state:按鈕的狀態:NORMAL, ACTIVE 或 DISABLED。默認值爲NORMAL。
        17 relief:邊框的裝飾。一般按鈕按下時是凹陷的,不然凸起。另外的可能取值有GROOVE, RIDGE, 和 FLAT。
        18 text:顯示在按鈕中的文本。文本能夠是多行。若是bitmaps或image選項被使用,則text選項被忽略
        19 textvariable:
        20 underline:在文本標籤中哪一個字符加下劃線。默認值爲-1,意思是沒有字符加下劃線
        21 width, height:按鈕的尺寸。若是按鈕顯示文本,尺寸使用文本的單位。若是按鈕顯示圖象,尺寸以象素爲單位(或屏幕的單位)。若是尺寸沒指定,它將根據按鈕的內容來計算。
        View Code



    •   Label Widget
      •   用來顯示文字或者圖片
      •   一些樣式
         1 #coding=gbk
         2 from tkinter import *
         3 master = Tk()
         4 
         5 #w = Label(master, text="Hello, world!")
         6 
         7 # w = Label(master, text="Rouge", fg="red")
         8 # w = Label(master, text="Helvetica", font=("Helvetica", 16))
         9 
        10 # w = Label(master, text=longtext, anchor=W, justify=LEFT)
        11 
        12 # v = StringVar()
        13 # Label(master, textvariable=v).pack()
        14 # v.set("New Text!")
        15 
        16 b.pack()
        17 mainloop()
        View Code
      •   部件選項和Button相同


    •   Canvans Widget
      •   用來提供劃線功能
      •   樣式
         1 #coding=gbk
         2 from tkinter import *
         3 master = Tk()
         4 
         5 w = Canvas(master, width=200, height=100)
         6 w.pack()
         7 # 
         8 # w.create_line(0, 0, 200, 100)
         9 # w.create_line(0, 100, 200, 0, fill="red", dash=(4, 4))
        10 # 
        11 # w.create_rectangle(50, 25, 150, 75, fill="blue")
        12 
        13 
        14 mainloop()
        View Code
      •   部件
         1 Canvas(root,bg):構造方法,在root上建立畫布,root是母控件,bg是背景色,用字符串設定,例如bg='white'
         2 
         3 create_rectancle(x1,y1,x2,y2[,fill,outline,width,stipple,dash,tags]):
         4 
         5    建立一個item對象,形狀是矩形,即在Canvas對象畫矩形,x1,y1,x2,y2是座標,是前4個參數,後面的參數順序是亂來的。fill表示item的填充顏色,凡是顏色都用字符串設定,outline表示邊框線的顏色,width表示邊框線的寬度,dash若是缺省,則邊框線是實線,不然用一個1到255的整數表示,設定虛線的長度,通常用10便可,stipple能夠在圖形中加入斑點,通常參數是'gray12','gray25'這樣,暫時不太清楚,通常省略。tags能夠是一個字符串或元組.列表等,使用後建立的item對象的tags字段就設定了,可用來做爲標識尋找該item,也能夠用Canvas.gettags(item)返回item的tags字段。注意tags若是是一個序列,則元組中任一元素均可以做爲標識符,也就是有多個標識符。該方法返回一個編號,而不是item對象自己,編號表示該item是Canvas的第幾個item。
         6 
         7 coords(item,position):
         8 
         9     移動一個item(即畫好的圖形)的位置,item爲移動的對象,position是一個元組,4個整數表示移動後的座標。
        10 
        11 find_withtag(tag):
        12 
        13     返回一個元組,表示全部以tag爲標識符的Item對象。item對象返回後不是一個對象而是一個整數,表明是Canvas對象的第幾個item而已。即便不用該方法,直接print(item),或item回車,顯示的也是item對象的編號,好比1,2,3這些而已。
        14 
        15 itemconfig(item[,item類的其餘參數,參見create_rectancle):
        16 
        17     設置item的各個參數,注意item能夠用編號表示。
        18 
        19 move(item,x,y):
        20 
        21     把item移動,座標增量爲x,y
        22 
        23 del(item or tag):
        24 
        25     刪除一個item,可用item編號(整數)或tag(字符串)
        26 
        27 scale(item,xoffset,yoffset,xscale,yscale):
        28 
        29     保持第一個端點不變,把變長,變爲:(原邊長 - offset)*scale + offset。簡單的用法是offset所有爲0,只改變變長的倍數
        30 
        31 tag_bind(tag,buttonType,methor):
        32 
        33     綁定事件與方法。當擁有tag標籤的item的邊框被點擊時,會調用Methor,buttonType用字符串表示,設定點擊的鍵,經常使用的'<Button-1>'表示鼠標左鍵,'<Button-3>'表示鼠標右鍵
        34 
        35 除了繪製矩形外,還有弧形,支線,文字,位圖(一些圖標),圖像文件等均可以繪製,具體看說明,再也不詳細記錄。
        View Code



    •   Frame Widget
      •   樣式
         1     #構造函數  
         2     __init__(self, vgap=0, hgap=0)  
         3     (Constructor)  
         4       
         5     Constructor, with optional parameters to specify the gap between the rows and columns.  
         6       
         7         Parameters:  
         8             vgap  
         9                        (type=int)  
        10       
        11             hgap  
        12                        (type=int)  
        13       
        14     #添加單個構件到boxsizer  
        15     # pos 表示的單元格的點(cell position能夠看作是座標)  
        16     # span 表示的單個或合併的單元格  
        17     Add(self, item, pos, span=DefaultSpan, flag=0, border=0, userData=None)  
        18       
        19     Adds an item to the sizer at the grid cell pos, optionally spanning more than one row or column as specified with span. The remaining args behave similarly to wx.Sizer.Add.  
        20       
        21     Returns True if the item was successfully placed at the given cell position, False if something was already there.  
        22       
        23         Parameters:  
        24             pos  
        25                        (type=GBPosition)  
        26       
        27             span  
        28                        (type=GBSpan)  
        29       
        30             flag  
        31                        (type=int)  
        32       
        33             border  
        34                        (type=int)  
        35     .  
        36     .  
        37     .  
        38     (原文: http://www.wxpython.org/docs/api/wx.GridBagSizer-class.html)  
        View Code
      •   部件實例測試
         1     def __init__(self, parent):  
         2             wx.Panel.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize)  
         3             wred = wx.TextCtrl(self, wx.NewId(), 'red')  
         4             wwhite = wx.TextCtrl(self, wx.NewId(), 'white')  
         5             wblue = wx.TextCtrl(self, wx.NewId())  
         6             wcyan = wx.TextCtrl(self, wx.NewId())  
         7               
         8             vgap, hgap = 10, 20  
         9             gbs = wx.GridBagSizer(vgap, hgap)  
        10               
        11             b = 0  
        12             # Add(self, item, pos, span=DefaultSpan, flag=0, border=0, userData=None)  
        13             # pos (type=GBPosition) cell position  
        14             # span(type=GBSPan)   
        15             gbs.Add(wred, (1, 1), (1, 1), wx.EXPAND | wx.ALL, b)  
        16             gbs.Add(wwhite, (2, 3), (1, 1), wx.EXPAND | wx.ALL, b)  
        17             gbs.Add(wblue, (1, 0), (1, 1), wx.EXPAND | wx.ALL, b)  
        18             gbs.Add(wcyan, (0, 0), (1, 1), wx.EXPAND | wx.ALL, b)  
        19               
        20             gbs.AddGrowableRow(0) # 0/1/2...表示的行號或列號  
        21             gbs.AddGrowableRow(1)  
        22             gbs.AddGrowableRow(2)  
        23             gbs.AddGrowableCol(0)  
        24             gbs.AddGrowableCol(1)  
        25             gbs.AddGrowableCol(3)  
        26               
        27             self.SetSizer(gbs)  
        View Code
      •   詳細測試


    •   Entry Widget詳解
      •   Entry用來輸入單行文本
         1 #Tkinter教程之Entry篇
         2 #Entry用來輸入單行文本
         3 '''1.第一個Entry程序'''
         4 from Tkinter import *
         5 root = Tk()
         6 Entry(root,text = 'input your text here').pack()
         7 root.mainloop()
         8 #上面的代碼目的是建立一個Entry對象,並在Entry上顯示'input your text here',運行此代碼,並無看到文本的顯示,由此可知與Lable和Button不一樣,Entry的text屬性不能夠設置Entry的文本
         9 
        10 '''2.在Entry中設定初始值,使用textvariable將變量與Entry綁定'''
        11 from Tkinter import *
        12 root = Tk()
        13 e = StringVar()
        14 entry = Entry(root,textvariable = e)
        15 e.set('input your text here')
        16 entry.pack()
        17 root.mainloop()
        18 
        19 #上面的例子中將變量e與Entry綁定,而後將e的值設置爲'input your text here',程序運行時的初始值便設置了。
        20 
        21 '''3.設置爲只讀Entry.
        22 Entry的另外一個比較有用的屬性,設置爲只讀,不容許用戶對它的值改變。
        23 設置state屬性爲'readonly'
        24 '''
        25 from Tkinter import *
        26 root = Tk()
        27 e = StringVar()
        28 entry = Entry(root,textvariable = e)
        29 e.set('input your text here')
        30 entry.pack()
        31 entry['state'] = 'readonly'
        32 root.mainloop()
        33 
        34 #實際上Entry的屬性值可使用的也爲normal/active/disabled,'readonly'與disabled同樣
        35 
        36 '''4.設置爲密碼輸入框
        37 #將Entry做爲一個密碼輸入框來使用,即不顯示用戶輸入的內容值,用特定符號代替。使用用屬性
        38 show來指定。
        39 '''
        40 from Tkinter import *
        41 root = Tk()
        42 e = StringVar()
        43 entry = Entry(root,textvariable = e)
        44 e.set('input your text here')
        45 entry.pack()
        46 #使用*來顯示輸入的內容,若是喜歡能夠改成其它字符
        47 entry['show'] = '*'
        48 #分別使用*#$顯示輸入的文本內容
        49 for mask in ['*','#','$']:
        50     e = StringVar()
        51     entry = Entry(root,textvariable = e)
        52     e.set('password')
        53     entry.pack()
        54     entry['show'] = mask
        55 
        56 root.mainloop()
        57 
        58 '''5.驗證輸入的內容是否符合要求。
        59 使用validate來校驗輸入的內容
        60 使用validate方法來限制輸入的內容
        61 這是一個有問題的例子,沒法調用validateText回調函數
        62 '''
        63 from Tkinter import *
        64 root = Tk()
        65 e = StringVar()
        66 def validateText(contents):
        67     print contents
        68     return contents.isalnum()
        69 
        70 entry = Entry(root,validate = 'key',textvariable = e,validatecommand = validateText)
        71 entry.pack()
        72 
        73 root.mainloop()
        74 '''
        75 文檔中說明使用validate來接受的事件,使用validatecommand來肯定輸入的內容是否合法,但
        76 如何傳入參數?沒找到相應的說明
        77 '''
        78 #還有其餘的屬性fg/bg/relief/width/height/justify/state使用方法與Button相同,再也不舉例。
        79 
        80 #author:     jcodeer
        81 #blog:    jcodeer.cublog.cn
        82 #email:    jcodeer@126.com
        View Code



    •   Menu Widget詳解
      •   Menu是用來創建菜單的
          1 #coding=gbk
          2 from tkinter import *
          3 # root = Tk()
          4 # def hello():
          5 #     print ("hello menu")
          6 # menubar = Menu(root)
          7 # #建立主菜單,每一個菜單對應的回調函數都是hello
          8 # for item in ['Python','PHP','CPP','C','Java','JavaScript','VBScript']:
          9 #     #添加菜單函數
         10 #     menubar.add_command(label = item,command = hello)
         11 # #將root的menu屬性設置爲menubar
         12 # root['menu'] = menubar
         13 # root.mainloop()
         14 
         15 
         16 # root = Tk()
         17 # def hello():
         18 #     print ('hello menu')
         19 # menubar = Menu(root)
         20 # 
         21 # filemenu = Menu(menubar,tearoff = 0)
         22 # for item in ['Python','PHP','CPP','C','Java','JavaScript','VBScript']:
         23 #     #添加菜單函數
         24 #     filemenu.add_commad(label = item,command = hello)
         25 # #將menubar的menu屬性指定爲filemenu,即filemenu爲menubar的下拉菜單
         26 # menubar.add_cascade(label = 'Language',menu = filemenu)
         27 # root['menu'] = menubar
         28 # root.mainloop()
         29 
         30 
         31 # '''3.向菜單中添加Checkbutton項'''
         32 # # -*- coding: cp936 -*-
         33 # from Tkinter import *
         34 # root = Tk()
         35 #每次打印出各個變量的當前值
         36 # root = Tk()
         37 # #每次打印出各個變量的當前值
         38 # def printItem():
         39 #     print ('Python = '),vPython.get()
         40 #     print ('PHP = '),vPHP.get()
         41 #     print ('CPP = '),vCPP.get()
         42 #     print ('C = '),vC.get()
         43 #     print ('Java = '),vJava.get()
         44 #     print ('JavaScript = '),vJavaScript.get()
         45 #     print ('VBScript = '),vVBScript.get()
         46 #     
         47 # menubar = Menu(root)
         48 # 
         49 # vPython = StringVar()
         50 # vPHP     = StringVar()
         51 # vCPP     = StringVar()
         52 # vC         = StringVar()
         53 # vJava     = StringVar()
         54 # vJavaScript = StringVar()
         55 # vVBScript     = StringVar()
         56 # 
         57 # filemenu = Menu(menubar,tearoff = 0)
         58 # for k,v in {'Python':vPython,
         59 #                'PHP':vPHP,
         60 #                'CPP':vCPP,
         61 #                'C':vC,
         62 #                'Java':vJava,
         63 #                'JavaScript':vJavaScript,
         64 #                'VBScript':vVBScript}.items():
         65 #     #綁定變量與回調函數
         66 #     filemenu.add_checkbutton(label = k,command = printItem,variable = v)
         67 # #將menubar的menu屬性指定爲filemenu,即filemenu爲menubar的下拉菜單
         68 # menubar.add_cascade(label = 'Language',menu = filemenu)
         69 # root['menu'] = menubar
         70 # root.mainloop()
         71 #程序運行,使用了Checkbutton,並經過printItem將每一個Checkbutton在當前值打印出來。
         72 
         73 
         74 
         75 # '''4.向菜單 中添加Radiobutton項'''
         76 # 
         77 # root = Tk()
         78 # 
         79 # menubar = Menu(root)
         80 # vLang = StringVar()
         81 # #每次打印出當前選中的語言
         82 # def printItem():
         83 #     print ('vLang = '),vLang.get()
         84 # filemenu = Menu(menubar,tearoff = 0)
         85 # for k in ['Python','PHP','CPP','C','Java','JavaScript','VBScript']:
         86 #     #綁定變量與回調函數,指定的變量vLang將這幾項劃爲一組
         87 #     filemenu.add_radiobutton(label = k,command = printItem,variable = vLang)
         88 # #將menubar的menu屬性指定爲filemenu,即filemenu爲menubar的下拉菜單
         89 # menubar.add_cascade(label = 'Language',menu = filemenu)
         90 # root['menu'] = menubar
         91 # root.mainloop()
         92 # #程序每次打印出當前選中的語言
         93 # #與Checkbutton不一樣的是,同一個組內只有一個處於選中狀態。
         94 
         95 
         96 '''5.向菜單中添加分隔符'''
         97 # # -*- coding: cp936 -*-
         98 # 
         99 # root = Tk()
        100 # menubar = Menu(root)
        101 # 
        102 # #每次打印出當前選中的語言
        103 # def printItem():
        104 #     print ('add_separator')
        105 # 
        106 # filemenu = Menu(menubar,tearoff = 0)
        107 # for k in ['Python','PHP','CPP','C','Java','JavaScript','VBScript']:
        108 #     filemenu.add_command(label = k,command = printItem)
        109 #     #將各個菜單項使用分隔符隔開
        110 #     filemenu.add_separator()
        111 # menubar.add_cascade(label = 'Language',menu = filemenu)
        112 # root['menu'] = menubar
        113 # root.mainloop()
        114 # #分隔符將相關的菜單項進行分組,只是UI上的實現,程序上沒有任何改變,它也不執行任何的命令
        115 
        116 
        117 
        118 ''' 6.將以上的例5中的菜單改成右擊彈出菜單'''
        119 #方法是經過綁定鼠標右鍵,每當點擊時彈出這個菜單,去掉與root的關聯
        120 # -*- coding: cp936 -*-
        121 
        122 # root = Tk()
        123 # menubar = Menu(root)
        124 # 
        125 # def printItem():
        126 #     print ('popup menu')
        127 # 
        128 # filemenu = Menu(menubar,tearoff = 0)
        129 # for k in ['Python','PHP','CPP','C','Java','JavaScript','VBScript']:
        130 #     filemenu.add_command(label = k,command = printItem)
        131 #     filemenu.add_separator()
        132 # menubar.add_cascade(label = 'Language',menu = filemenu)
        133 # #此時就不要將root的menu設置爲menubar了
        134 # #root['menu'] = menubar
        135 # def popup(event):
        136 #     #顯示菜單
        137 #     #這裏設置右鍵點擊顯示菜單
        138 #     menubar.post(event.x_root,event.y_root)
        139 # #在這裏相應鼠標的右鍵事件,右擊時調用popup,此時與菜單綁定的是root,能夠設置爲其它的控件,在綁定的控件上右擊就能夠彈出菜單
        140 # root.bind('<Button-3>',popup)
        141 # root.mainloop()
        142 # #運行測試一個,能夠看到各個菜單 項的功能都是可使用的,因此彈出菜單與通常的菜單功能是同樣的,只是彈出的方式不一樣而已。
        143 
        144 
        145 
        146 ''' 7.如下的代碼演示了菜單項的操做方法,包括添加各類菜單項,刪除一個或多個菜單項'''
        147 # -*- coding: cp936 -*-
        148 
        149 root = Tk()
        150 menubar = Menu(root)
        151 
        152 def printItem():
        153     print ('add_separator')
        154 
        155 filemenu = Menu(menubar,tearoff = 0)
        156 for k in range(5):
        157     filemenu.add_command(label = str(k),command = printItem)
        158 menubar.add_cascade(label = 'Language',menu = filemenu)
        159 
        160 '''如下爲向菜單中添加項的操做'''
        161 #在索引1添加一菜單command項
        162 filemenu.insert_command(1,label = '1000',command = printItem)
        163 #在索引2添加一菜單checkbutton項
        164 filemenu.insert_checkbutton(2,label = '2000',command = printItem)
        165 #在索引3添加一菜單radiobutton項
        166 filemenu.insert_radiobutton(3,label = '3000',command = printItem)
        167 #將新添加的菜單項使用分隔符隔開
        168 filemenu.insert_separator(1)
        169 filemenu.insert_separator(5)
        170 
        171 '''如下爲刪除菜單項的操做'''
        172 #刪除索引6-9的菜單項
        173 #這兩個參數是控制刪除下拉列表的位置的
        174 filemenu.delete(4,9)
        175 #刪除索引爲0的菜單項
        176 filemenu.delete(0)
        177 
        178 root['menu'] = menubar
        179 root.mainloop()
        180 #分隔符將相關的菜單項進行分組,只是UI上的實現,程序上沒有任何改變,它也不執行任何的命令
        View Code



    •   CheckButton Widget詳解
      •   Checkbutton又稱爲多選按鈕,能夠表示兩種狀態:On和Off,能夠設置回調函數,每當點擊此按鈕時回調函數被調用。就是至關於勾選框同樣
         1 #coding=gbk
         2 '''1.一個簡單的Checkbutton例子'''
         3 #建立一個Checkbutton,顯示文本爲"python"
         4 from tkinter import *
         5 # root = Tk()
         6 # Checkbutton(root,text = 'python').pack()
         7 # root.mainloop()
         8 
         9 
        10 '''2.設置Checkbutton的回調函數'''
        11 # def callCheckbutton():
        12 #     print ('you check this button')
        13 # root = Tk()
        14 # Checkbutton(root,text = 'check python',command = callCheckbutton).pack()
        15 # root.mainloop()
        16 # #無論Checkbutton的狀態如何,此回調函數都會被調用
        17 
        18 
        19 '''3.經過回調函數改變Checkbutton的顯示文本text的值'''
        20 
        21 # def callCheckbutton():
        22 #     #改變v的值,即改變Checkbutton的顯示值
        23 #     v.set('check Tkinter')
        24 # 
        25 # root = Tk()
        26 # v = StringVar()
        27 # v.set('check python')
        28 # #綁定v到Checkbutton的屬性textvariable
        29 # Checkbutton(root,text = 'check python',textvariable = v,command = callCheckbutton).pack()
        30 # 
        31 # root.mainloop()
        32 
        33 
        34 '''4.上述的textvariable使用方法與Button的用法徹底相同,使用此例是爲了區別Checkbutton的另外的一個屬性variable,此屬性與textvariable不一樣,它是與這個控件自己綁定,Checkbutton本身有值:On和Off值,缺省狀態On爲1,Off爲0,如:'''
        35 # #顯示Checkbutton的值
        36 # root = Tk()
        37 # #將一整數與Checkbutton的值綁定,每次點擊Checkbutton,將打印出當前的值
        38 # v = IntVar()
        39 # def callCheckbutton():
        40 #     print (v.get())
        41 # Checkbutton(root,
        42 #             variable = v,
        43 #             text = 'checkbutton value',
        44 #             command = callCheckbutton).pack()
        45 # root.mainloop()
        46 
        47 
        48 '''5.Checkbutton的值不只僅是1或0,能夠是其餘類型的數值,能夠經過onvalue和offvalue屬性設置Checkbutton的狀態值,以下代碼將On設置爲'python',Off值設置爲'Tkinter',程序的打印值將再也不是0或1,而是'Tkinter’或‘python’'''
        49 # root = Tk()
        50 # #將一字符串與Checkbutton的值綁定,每次點擊Checkbutton,將打印出當前的值
        51 # v = StringVar()
        52 # def callCheckbutton():
        53 #     print (v.get())
        54 # Checkbutton(root,
        55 #             variable = v,
        56 #             text = 'checkbutton value',
        57 #             onvalue = 'python',        #設置On的值
        58 #             offvalue = 'tkinter',    #設置Off的值
        59 #             command = callCheckbutton).pack()
        60 # root.mainloop()
        61 
        62 # 6.還有其餘的屬性fg/bg/relief/width/height/justify/state使用方法與Button相同,再也不舉例。
        View Code



    •   RadioButton Widget詳解
      •   Radiobutton爲單選按鈕,即在同一組內只能有一個按鈕被選中,每當選中組內的一個按鈕時,其它的按鈕自動改成非選中態,與其餘控件不一樣的是:它有組的概念
         1 #coding=gbk
         2 '''1.建立一個簡單的Radiobutton'''
         3 from tkinter import *
         4 # root = Tk()
         5 # Radiobutton(root,text = 'python').pack()
         6 # Radiobutton(root,text = 'tkinter').pack()
         7 # Radiobutton(root,text = 'widget').pack()
         8 # root.mainloop()
         9 # #不指定綁定變量,每一個Radiobutton自成一組
        10 
        11 
        12 '''2.建立一個Radiobutton組,使用綁定變量來設置選中哦的按鈕'''
        13 # root = Tk()
        14 # #建立一個Radiobutton組,建立三個Radiobutton,並綁定到整型變量v
        15 # #選中value=1的按鈕
        16 # v = IntVar()
        17 # v.set(1)
        18 # for i in range(3):
        19 #     Radiobutton(root,variable = v,text = 'python',value = i).pack()
        20 # root.mainloop()
        21 
        22 
        23 '''3.建立兩個不一樣的組'''
        24 # root = Tk()
        25 # vLang = IntVar()
        26 # vOS = IntVar()
        27 # vLang.set(1)
        28 # vOS.set(2)
        29 # 
        30 # for v in [vLang,vOS]:    #建立兩個組
        31 #     for i in range(3):    #每一個組含有3個按鈕
        32 #         Radiobutton(root,
        33 #                     variable = v,
        34 #                     value = i,
        35 #                     text = 'python' + str(i)
        36 #                     ).pack()
        37 # root.mainloop()
        38 # #不一樣的組,各個按鈕互不影響。
        39 
        40 
        41 
        42 '''4.若是同一個組中的按鈕使用相同的alue,則這兩個按鈕的工做方式徹底相同'''
        43 
        44 root = Tk()
        45 v = IntVar()
        46 v.set(1)
        47 for i in range(3):
        48     Radiobutton(root,
        49                 variable = v,
        50                 value = 1,
        51                 text = 'python' + str(i)
        52                 ).pack()
        53 for i in range(3):
        54     Radiobutton(root,
        55                     variable = v,
        56                     value = i,
        57                     text = 'python' + str(2 + i)
        58                     ).pack()
        59 root.mainloop()
        60 #上述的例子中共有4個alue爲1的值,當選中其中的一個時,其餘三個也會被選中;選中除了這四個只外的按鈕時,四個按鈕所有取消
        61 
        62 
        63 '''5.與Checkbutton相似,每一個Radiobutton能夠有本身的處理函數,每當點擊按鈕時,系統會調用相應的處理函數'''
        64 # -*- coding: cp936 -*-
        65 
        66 # root = Tk()
        67 # v = IntVar()
        68 # v.set(0)
        69 # def r1():
        70 #     print ('call r1')
        71 # def r2():
        72 #     print ('call r2')
        73 # def r3():
        74 #     print ('call r3')
        75 # def r4():
        76 #     print ('call r4')
        77 # i = 0
        78 # #建立8個按鈕,其中兩個兩個的value值相同
        79 # for r in [r1,r2,r3,r4]:
        80 #     Radiobutton(root,
        81 #                     variable = v,
        82 #                     text = 'radio button',
        83 #                     value = i,
        84 #                     command = r
        85 #                     ).pack()
        86 #     Radiobutton(root,
        87 #                     variable = v,
        88 #                     text = 'radio button',
        89 #                     value = i,
        90 #                     command = r
        91 #                     ).pack()
        92 #     i += 1
        93 #     
        94 # root.mainloop()
        95 # #注意雖然同時能夠選中兩個按鈕,但每次點擊按鈕,執行的代碼只有一次
        View Code



    •   LsitBox Widget詳解
      • Listbox爲列表框控件,它能夠包含一個或多個文本項(text item),能夠設置爲單選或多選
          1 '''1.建立一個Listbox,向其中添加三個item'''
          2 from Tkinter import *
          3 root = Tk()
          4 lb = Listbox(root)
          5 for item in ['python','tkinter','widget']:
          6     lb.insert(END,item)
          7 lb.pack()
          8 root.mainloop()
          9 
         10 '''2.建立一個能夠多選的Listbox,使用屬性selectmaod'''
         11 from Tkinter import *
         12 root = Tk()
         13 lb = Listbox(root,selectmode = MULTIPLE)
         14 for item in ['python','tkinter','widget']:
         15     lb.insert(END,item)
         16 lb.pack()
         17 root.mainloop()
         18 # 依次點擊這三個item,均顯示爲選中狀態。
         19 # 屬性MULTIPLE容許多選,每次點擊item,它將改變本身的當前選狀態,與Checkbox有點類似
         20 
         21 '''3這個屬性selectmode還能夠設置爲BROWSE,能夠經過鼠標來移動Listbox中的選中位置(不是移動item),這個屬性也是Listbox在默認設置的值,這個程序與1.程序運行的結果的同樣的。'''
         22 from Tkinter import *
         23 root = Tk()
         24 lb = Listbox(root,selectmode = BROWSE)
         25 for item in ['python','tkinter','widget']:
         26     lb.insert(END,item)
         27 lb.pack()
         28 root.mainloop()
         29 #使用鼠標進行拖動,能夠看到選中的位置隨之變化。
         30 # 與BROWSE類似 的爲SINGLE,但不支持鼠標移動選中位置。
         31 from Tkinter import *
         32 root = Tk()
         33 lb = Listbox(root,selectmode = BROWSE)
         34 for item in ['python','tkinter','widget']:
         35     lb.insert(END,item)
         36 lb.pack()
         37 root.mainloop()
         38 #使用鼠標進行拖動,沒有任何變化
         39 '''4.使用selectmode  = EXPANDED使用Listbox來支持Shift和Control。'''
         40 from Tkinter import *
         41 root = Tk()
         42 lb = Listbox(root,selectmode = EXTENDED)
         43 for item in ['python','tkinter','widget']:
         44     lb.insert(END,item)
         45 lb.pack()
         46 root.mainloop()
         47 #運行程序,點中「python",shift + 點擊"widget",會選中全部的item
         48 #運行程序,點中"python",control + 點擊"widget",會選中python和widget,第二項tkinter處於非選中狀態
         49 
         50 '''5.向Listbox中添加一個item'''
         51 # 以上的例子均使用了insert來向Listbox中添加 一個item,這個函數有兩個屬性一個爲添加的索引值,另外一個爲添加的項(item)
         52 #  有兩個特殊的值ACTIVE和END,ACTIVE是向當前選中的item前插入一個(即便用當前選中的索引做爲插入位置);END是向
         53 #  Listbox的最後一項添加插入一項
         54 # 先向Listbox中追加三個item,再在Listbox開始添加三項
         55 from Tkinter import *
         56 root = Tk()
         57 lb = Listbox(root)
         58 for item in ['python','tkinter','widget']:
         59     lb.insert(END,item)
         60 #只添加一項將[]做爲一個item
         61 #lb.insert(0,['linux','windows','unix'])
         62 #添加三項,每一個string爲一個item
         63 lb.insert(0,'linux','windows','unix')
         64 lb.pack()
         65 root.mainloop()
         66 '''6.刪除Listbox中的項,使用delete,這個函數也有兩個參數,第一個爲開始的索引值;第二個爲結束的索引值,若是不指定則只刪除第一個索引項。'''
         67 from Tkinter import *
         68 root = Tk()
         69 lb = Listbox(root)
         70 for i in range(10):
         71     lb.insert(END,str(i))
         72 lb.delete(1,3)
         73 lb.pack()
         74 root.mainloop()
         75 #運行程序,只有值0456789,1-3被刪除
         76 #刪除所有內容,使用delete指定第一個索引值0和最後一個參數END,便可
         77 #lb.delete(0,END)
         78 '''7.選中操做函數,使用函數實現。selection_set函數有兩個參數第一個爲開始的索引;第二個爲結束的索引,若是不指定則只選中第一個參數指定的索引項'''
         79 from Tkinter import *
         80 root = Tk()
         81 lb = Listbox(root)
         82 for i in range(10):
         83     lb.insert(END,str(i))
         84 lb.selection_set(0,10)
         85 lb.pack()
         86 root.mainloop()
         87 #  程序運行結果,選中了全部的項。 此代碼並未指定Listbox爲MULTIPLE或EXTENDED,查經過selection_set仍舊能夠對Listbox
         88 #進行操做。
         89 
         90 #與之相對的即是取消選中的函數了,參數與selection_set在參數相同,以下代碼取消索引從0-3在狀態
         91 from Tkinter import *
         92 root = Tk()
         93 lb = Listbox(root)
         94 for i in range(10):
         95     lb.insert(END,str(i))
         96 lb.selection_set(0,10)
         97 lb.selection_clear(0,3)
         98 lb.pack()
         99 root.mainloop()
        100 
        101 '''8.獲得當前Listbox中的item個數'''
        102 from Tkinter import *
        103 root = Tk()
        104 lb = Listbox(root)
        105 for i in range(10):
        106     lb.insert(END,str(i))
        107 lb.delete(3)
        108 print lb.size()
        109 lb.pack()
        110 root.mainloop()
        111 #首先向Listbox中添加 了10個item,而後刪除索引爲3在item,最後的打印結果爲9,即當前的Listbox中只有9項
        112 
        113 '''9.返回指定索引的項'''
        114 from Tkinter import *
        115 root = Tk()
        116 lb = Listbox(root)
        117 for i in range(10):
        118     lb.insert(END,str(i*100))
        119 print lb.get(3)
        120 lb.pack()
        121 root.mainloop()
        122 #返回值爲300
        123 #get也爲兩個參數的函數,能夠返回多個項(item),以下返回索引值3-7的值
        124 from Tkinter import *
        125 root = Tk()
        126 lb = Listbox(root)
        127 for i in range(10):
        128     lb.insert(END,str(i*100))
        129 print lb.get(3,7)
        130 lb.pack()
        131 root.mainloop()
        132 #返回值爲('300', '400', '500', '600', '700'),是一個tuple類型。
        133 
        134 '''10.返回當前返回的項的索引,不是item的值'''
        135 from Tkinter import *
        136 root = Tk()
        137 lb = Listbox(root)
        138 for i in range(10):
        139     lb.insert(END,str(i*100))
        140 lb.selection_set(3,8)
        141 print lb.curselection()
        142 lb.pack()
        143 root.mainloop()
        144 #返回值爲('3', '4', '5', '6', '7', '8'),而不是('300','400','500','600','700','800'),啞然沒法直接獲得各項的值,知道了索引,獲得值
        145 #就很容易了:lb.get()就能夠實現。
        146 
        147 '''11.判斷 一個項是否被選中,使用索引。'''
        148 from Tkinter import *
        149 root = Tk()
        150 lb = Listbox(root)
        151 for i in range(10):
        152     lb.insert(END,str(i*100))
        153 lb.selection_set(3,8)
        154 print lb.selection_includes(8)
        155 print lb.selection_includes(0)
        156 
        157 lb.pack()
        158 root.mainloop()
        159 #返回結果:True Flase,即8包含在選中的索引中,0不包含在選中的索引中
        160 
        161 '''12.Listbox與變量綁定'''
        162 # -*- coding: cp936 -*-
        163 from Tkinter import *
        164 root = Tk()
        165 v = StringVar()
        166 lb = Listbox(root,listvariable = v)
        167 for i in range(10):
        168     lb.insert(END,str(i*100))
        169 #打印當前列表中的項值
        170 print v.get()
        171 #輸出:('0', '100', '200', '300', '400', '500', '600', '700', '800', '900')
        172 #改變v的值,使用tuple能夠與item對應
        173 v.set(('1000','200'))
        174 #結果只有兩項了1000和200
        175 lb.pack()
        176 root.mainloop()
        177 
        178 '''13.Listbox與事件綁定'''
        179 #  它不支持command屬性來設置回調函數了,使用bind來指定回調函數,打印當前選中的值
        180 # -*- coding: cp936 -*-
        181 from Tkinter import *
        182 root = Tk()
        183 def printList(event):
        184     print lb.get(lb.curselection()) 
        185 lb = Listbox(root)
        186 lb.bind('<Double-Button-1>',printList)
        187 for i in range(10):
        188     lb.insert(END,str(i*100))
        189 lb.pack()
        190 root.mainloop()
        191 
        192 #還有一個比較實用的功能沒有介紹:滾動條的添加,留到後面介紹Scrollbar的時候再一併介紹
        View Code



    •   Message Widget詳解
      •   用法和Label同樣


    •   TopLevel Widget詳解
      •   TopLevel與Frame相似,但它包含窗體屬性(如Title)
         1 '''1.建立簡單的Toplevel'''
         2 # -*- coding: cp936 -*-
         3 from Tkinter import *
         4 root = Tk()
         5 tl = Toplevel()
         6 #爲了區別root和tl,咱們向tl中添加了一個Label
         7 Label(tl,text = 'hello label').pack()
         8 root.mainloop()
         9 #運行結果生成了兩個窗體,一個是root啓動的,另外一個則是Toplevel建立的,它包含有一個label;關閉tl
        10 #則沒有退出程序,Tk仍舊工做;若關閉Tk,整個Tk結束tl也結束,它不能單獨存在。
        11 
        12 '''2.設置Toplevel的屬性'''
        13 #title設置標題
        14 #geometry設置寬和高
        15 # -*- coding: cp936 -*-
        16 from Tkinter import *
        17 root = Tk()
        18 tl = Toplevel()
        19 #設置tl的title
        20 tl.title('hello Toplevel')
        21 #設置tl在寬和高
        22 tl.geometry('400x300')
        23 #爲了區別root和tl,咱們向tl中添加了一個Label
        24 Label(tl,text = 'hello label').pack()
        25 root.mainloop()
        26 
        27 '''3.使用Toplevel本身製做提示框'''
        28 # -*- coding: cp936 -*-
        29 from Tkinter import *
        30 root = Tk()
        31 mbYes,mbYesNo,mbYesNoCancel,mbYesNoAbort = 0,1,2,4
        32 #定義一個消息對話框,依據傳入的參數不一樣,彈出不一樣的提示信息
        33 def MessageBox(): #沒有使用使用參數
        34         mbType = mbYesNo
        35     textShow = 'Yes'
        36     if mbType == mbYes:
        37         textShow = 'Yes'
        38     elif mbType == mbYesNo:
        39         textShow = 'YesNo'
        40     elif mbType == mbYesNoCancel:
        41         textShow = 'YesNoCancel'
        42     elif mbType == mbYesNoAbort:
        43         textShow = 'YesNoAbort'
        44     tl = Toplevel(height = 200,width = 400)
        45     Label(tl,text = textShow).pack()
        46 #由Button來啓動這個消息框,由於它使用了空的回調函數,故MessageBox改成了無參數形式,使用了固定
        47 #值mbYesNo
        48 Button(root,text = 'click me',command = MessageBox).pack()
        49 root.mainloop()
        View Code
相關文章
相關標籤/搜索