Tkinter模塊("Tk 接口")是Python的標准Tk GUI工具包的接口,位Python的內置模塊,直接import tkinter即可使用。
作為實踐, 用Tkinter做了個ascii碼轉化查詢表
1. 產品介紹
界面
功能
- 通過輸入字符或數字查詢對應的信息
- 通過選擇列表中的信息查詢對應的信息
2. 設計規划
規划圖
3. 相關知識
首先看怎么產生第一個窗口
from Tkinter import * #引用Tk模塊 root = Tk() #初始化Tk() root.mainloop() #進入消息循環
幾個常用屬性
- title: 設置窗口標題
- geometry: 設置窗口大小
- resizable():設置窗口是否可以變化長 寬
# -*- coding: cp936 -*- from Tkinter import * root = Tk() root.title("hello world") root.geometry('200x100') #是x 不是* root.resizable(width=False, height=True) #寬不可變, 高可變,默認為True root.mainloop()
介紹以下幾個控件的用法
- Label
- Frame
- Entry
- Text
- Button
- Listbox
- Scrollbar
說明每個控件最后要加上pack().否則控件是無法顯示的.
3.1 Label
說明
標簽
用法
Label(根對象, [屬性列表])
屬性
- text 要現實的文本
- bg 背景顏色
- font 字體(顏色, 大小)
- width 控件寬度
- height 控件高度
以下介紹的控件差不多都有這幾個屬性, 更詳細的屬性查看參考網頁
舉例
# -*- coding: cp936 -*- from Tkinter import * root = Tk() root.title("hello world") root.geometry('300x200') l = Label(root, text="show", bg="green", font=("Arial", 12), width=5, height=2) l.pack(side=LEFT) #這里的side可以賦值為LEFT RTGHT TOP BOTTOM root.mainloop()
效果
3.2 Frame
說明
在屏幕上創建一塊矩形區域,多作為容器來布局窗體
用法
Frame(根對象, [屬性列表])
舉例
要在控件中出現這樣的四個詞語
校訓
厚德 敬業
博學 樂群
可以規划為
# -*- coding: cp936 -*- from Tkinter import * root = Tk() root.title("hello world") root.geometry('300x200') Label(root, text='校訓'.decode('gbk').encode('utf8'), font=('Arial', 20)).pack() frm = Frame(root) #left frm_L = Frame(frm) Label(frm_L, text='厚德'.decode('gbk').encode('utf8'), font=('Arial', 15)).pack(side=TOP) Label(frm_L, text='博學'.decode('gbk').encode('utf8'), font=('Arial', 15)).pack(side=TOP) frm_L.pack(side=LEFT) #right frm_R = Frame(frm) Label(frm_R, text='敬業'.decode('gbk').encode('utf8'), font=('Arial', 15)).pack(side=TOP) Label(frm_R, text='樂群'.decode('gbk').encode('utf8'), font=('Arial', 15)).pack(side=TOP) frm_R.pack(side=RIGHT) frm.pack() root.mainloop()
效果
3.3 Entry
說明
創建單行文本框
用法
- 創建:lb =Entry(根對象, [屬性列表])
- 綁定變量 var=StringVar() lb=Entry(根對象, textvariable = var)
- 獲取文本框中的值 var.get()
- 設置文本框中的值 var.set(item1)
舉例
# -*- coding: cp936 -*- from Tkinter import * root = Tk() root.title("hello world") root.geometry() var = StringVar() e = Entry(root, textvariable = var) var.set("hello") e.pack() root.mainloop()
效果
3.4 Text
說明
向該空間內輸入文本
用法
t = Text(根對象)
插入:t.insert(mark, 內容)
刪除:t.delete(mark1, mark2)
其中,mark可以是行號,或者特殊標識,例如
- INSERT:光標的插入點CURRENT:鼠標的當前位置所對應的字符位置
- END:這個Textbuffer的最后一個字符
- SEL_FIRST:選中文本域的第一個字符,如果沒有選中區域則會引發異常
- SEL_LAST:選中文本域的最后一個字符,如果沒有選中區域則會引發 異常
舉例
# -*- coding: cp936 -*- from Tkinter import * root = Tk() root.title("hello world") root.geometry('300x200') t = Text(root) t.insert(1.0, 'hello\n') t.insert(END, 'hello000000\n') t.insert(END, 'nono') t.pack() root.mainloop()
效果
3.5 Button
說明
創建按鈕
用法
Button(根對象, [屬性列表])
舉例
# -*- coding: cp936 -*- from Tkinter import * root = Tk() root.title("hello world") root.geometry() def printhello(): t.insert('1.0', "hello\n") t = Text() t.pack() Button(root, text="press", command = printhello).pack() root.mainloop()
效果
3.6 Listbox
說明
列表控件,可以含有一個或多個文本想,可單選也可多選
用法
- 創建:lb = ListBox(根對象, [屬性列表])
- 綁定變量 var=StringVar() lb=ListBox(根對象, listvariable = var)
- 得到列表中的所有值 var.get()
- 設置列表中的所有值 var.set((item1, item2, .....))
- 添加:lb.insert(item)
- 刪除:lb.delete(item,...)
- 綁定事件 lb.bind('<ButtonRelease-1>', 函數)
- 獲得所選中的選項 lbl.get(lb.curselection())
屬性
selectmode可以為BROWSE MULTIPL SINGLE
舉例
# -*- coding: cp936 -*- from Tkinter import * root = Tk() root.title("hello world") root.geometry() def print_item(event): print lb.get(lb.curselection()) var = StringVar() lb = Listbox(root, listvariable = var) list_item = [1, 2, 3, 4] #控件的內容為1 2 3 4 for item in list_item: lb.insert(END, item) lb.delete(2, 4) #此時控件的內容為1 3
var.set(('a', 'ab', 'c', 'd')) #重新設置了,這時控件的內容就編程var的內容了 print var.get() lb.bind('<ButtonRelease-1>', print_item) lb.pack() root.mainloop()
效果
3.7 Scrollbar
說明
在屏幕上創建一塊矩形區域,多作為容器來布局窗體
用法
Frame(根對象, [屬性列表]), 最長用的用法是和別的控件一起使用.
舉例
from Tkinter import * root = Tk() root.title("hello world") root.geometry() def print_item(event): print lb.get(lb.curselection()) var = StringVar() lb = Listbox(root, height=5, selectmode=BROWSE, listvariable = var) lb.bind('<ButtonRelease-1>', print_item) list_item = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] for item in list_item: lb.insert(END, item) scrl = Scrollbar(root) scrl.pack(side=RIGHT, fill=Y) lb.configure(yscrollcommand = scrl.set) lb.pack(side=LEFT, fill=BOTH) scrl['command'] = lb.yview root.mainloop()
效果
4. 源碼附件
代碼
# -*- coding:cp936 -*- from Tkinter import * class show: num_info_hash = {} char_info_hash = {} num_char = {} char_num = {} def __init__(self): self.root = Tk() self.root.title("ASCII碼查詢".decode('gbk').encode('utf8')) #self.root.geometry('470x320') ######## self.frm = Frame(self.root) #Top Label(self.root, text="ASCII碼查詢".decode('gbk').encode('utf8'), font=('Arial', 15)).pack() self.load_sys() self.frm = Frame(self.root) #Left self.frm_L = Frame(self.frm) self.frm_LT = Frame(self.frm_L) self.var_char = StringVar() Entry(self.frm_LT, textvariable=self.var_char, width = 5, font =('Verdana',15)).pack(side=RIGHT) Label(self.frm_LT, text = '字符'.decode('gbk').encode('utf8'), font =('Arial',12)).pack(side=LEFT) self.frm_LT.pack() self.var_L_char = StringVar() self.lb_char = Listbox(self.frm_L, selectmode=BROWSE, listvariable=self.var_L_char, font =('Verdana',12), width=10, height=13) self.lb_char.bind('<ButtonRelease-1>', self.get_char) for key in self.char_num: self.lb_char.insert(END, key[0]) self.scrl_char = Scrollbar(self.frm_L) self.scrl_char.pack(side=RIGHT, fill=Y) self.lb_char.configure(yscrollcommand = self.scrl_char.set) self.lb_char.pack(side=LEFT, fill=BOTH) self.scrl_char['command'] = self.lb_char.yview self.frm_L.pack(side = LEFT) #Mid self.frm_M = Frame(self.frm) self.t_show = Text(self.frm_M, width=20, height=5, font =('Verdana',15)) self.t_show.insert('1.0', '') self.t_show.pack() self.frm_MB = Frame(self.frm_M) Button(self.frm_MB, text="清除".decode('gbk').encode('utf-8'), command=self.clear, width=6, height=1, font=('Arial', 10)).pack(side=LEFT) Button(self.frm_MB, text="查詢".decode('gbk').encode('utf-8'), command=self.search, width=6, height=1, font=('Arial', 10)).pack(side=RIGHT) self.frm_MB.pack(side=BOTTOM) self.frm_M.pack(side=LEFT) #Right self.frm_R = Frame(self.frm) self.frm_RT = Frame(self.frm_R) self.var_int = StringVar() Entry(self.frm_RT, textvariable=self.var_int, width=5, font =('Verdana',15)).pack(side=LEFT) Label(self.frm_RT, text='十進制'.decode('gbk').encode('utf-8'), font =('Arial',12)).pack(side=RIGHT) self.frm_RT.pack() self.var_R_int = StringVar() self.lb_int = Listbox(self.frm_R, selectmode=BROWSE, listvariable=self.var_R_int, font =('Verdana',12), width=10, height=13) self.lb_int.bind('<ButtonRelease-1>', self.get_int,) for key in self.num_char: self.lb_int.insert(END, key[0]) self.scrl_int = Scrollbar(self.frm_R) self.scrl_int.pack(side=RIGHT, fill=Y) self.lb_int.configure(yscrollcommand = self.scrl_int.set) self.lb_int.pack(side=LEFT, fill=BOTH) self.scrl_int['command'] = self.lb_int.yview self.frm_R.pack(side = LEFT) self.frm.pack() ######## def get_char(self, event): self.var_char.set('') self.var_int.set('') tmp = self.lb_char.get(self.lb_char.curselection()) self.var_char.set(tmp) def get_int(self, event): self.var_int.set('') self.var_char.set('') tmp = self.lb_int.get(self.lb_int.curselection()) self.var_int.set(tmp) def clear(self): self.var_char.set('') self.var_int.set('') self.t_show.delete('1.0', '10.0') def search(self): self.t_show.delete('1.0', '100.0') tmp_char = self.var_char.get() tmp_int = self.var_int.get() if tmp_char != '': if not self.char_info_hash.has_key(tmp_char): self.t_show.insert('1.0', "您輸入的字符不在128個字符之內".decode('gbk').encode('utf8')) else: self.t_show.insert('1.0', '十六進制:'.decode('gbk').encode('utf8') + '\t' + self.char_info_hash[tmp_char][2] + '\n') self.t_show.insert('1.0', '十進制:'.decode('gbk').encode('utf8') +'\t' + self.char_info_hash[tmp_char][1] + '\n') self.t_show.insert('1.0', '八進制:'.decode('gbk').encode('utf8') + '\t' + self.char_info_hash[tmp_char][0] + '\n') self.t_show.insert('1.0', '字符:'.decode('gbk').encode('utf8') +'\t' + tmp_char + '\n\n') self.var_char.set('') self.var_int.set('') elif tmp_int !='': if not self.num_info_hash.has_key(tmp_int): self.t_show.insert('1.0', "請輸入介於0~127之間的整數".decode('gbk').encode('utf8')) else: self.t_show.insert('1.0', '字符:'.decode('gbk').encode('utf8') +'\t' + self.num_info_hash[tmp_int][2] + '\n') self.t_show.insert('1.0', '十六進制:'.decode('gbk').encode('utf8') + '\t' + self.num_info_hash[tmp_int][1] + '\n') self.t_show.insert('1.0', '八進制:'.decode('gbk').encode('utf8') + '\t' + self.num_info_hash[tmp_int][0] + '\n') self.t_show.insert('1.0', '十進制:'.decode('gbk').encode('utf8') + '\t' + tmp_int + '\n\n') self.var_char.set('') self.var_int.set('') else: self.t_show.insert('1.0', '請選擇或輸入'.decode('gbk').encode('utf8')) def load_sys(self): f = file('asc') for line in f: chunk = line.strip().split('\t') self.num_char[int(chunk[1])] = chunk[3] self.char_num[chunk[3]] = int(chunk[1]) self.num_info_hash[chunk[1]] = [chunk[0], chunk[2], chunk[3]] self.char_info_hash[chunk[3]] = [chunk[0], chunk[1], chunk[2]] self.num_char =sorted(self.num_char.iteritems(), key = lambda asd:asd[0]) self.char_num =sorted(self.char_num.iteritems(), key = lambda asd:asd[1]) def main(): d = show() mainloop() if __name__== "__main__": main()
文本
0 00 nul 1 01 soh 2 02 stx 3 03 etx 4 04 eot 5 05 enq 6 06 ack 7 07 bel 8 08 bs 9 09 ht 10 0a nl 11 0b vt 12 0c ff 13 0d er 14 0e so 15 0f si 16 10 dle 17 11 dc1 18 12 dc2 19 13 dc3 20 14 dc4 21 15 nak 22 16 syn 23 17 etb 24 18 can 25 19 em 26 1a sub 27 1b esc 28 1c fs 29 1d gs 30 1e re 31 1f us 32 20 sp 33 21 ! 34 22 " 35 23 # 36 24 $ 37 25 % 38 26 & 39 27 ` 40 28 ( 41 29 ) 42 2a * 43 2b + 44 2c , 45 2d - 46 2e . 47 2f / 48 30 0 49 31 1 50 32 2 51 33 3 52 34 4 53 35 5 54 36 6 55 37 7 56 38 8 57 39 9 58 3a : 59 3b ; 60 3c < 61 3d = 62 3e > 63 3f ? 64 40 @ 65 41 A 66 42 B 67 43 C 68 44 D 69 45 E 70 46 F 71 47 G 72 48 H 73 49 I 74 4a J 75 4b K 76 4c L 77 4d M 78 4e N 79 4f O 80 50 P 81 51 Q 82 52 R 83 53 S 84 54 T 85 55 U 86 56 V 87 57 W 88 58 X 89 59 Y 90 5a Z 91 5b [ 92 5c \ 93 5d ] 94 5e ^ 95 5f _ 96 60 ' 97 61 a 98 62 b 99 63 c 100 64 d 101 65 e 102 66 f 103 67 g 104 68 h 105 69 i 106 6a j 107 6b k 108 6c l 109 6d m 110 6e n 111 6f o 112 70 p 113 71 q 114 72 r 115 73 s 116 74 t 117 75 u 118 76 v 119 77 w 120 78 x 121 79 y 122 7a z 123 7b { 124 7c | 125 7d } 126 7e ~ 127 7f del
Python Tkinter參考資料之(通用控件屬性)
大部分控件的共享選項:
選項(別名) |
說明 |
單位 |
典型值 |
沒有此屬性的控件 |
background(bg) |
當控件顯示時,給出的正常顏色 |
color |
'gray25' '#ff4400' |
|
borderwidth(bd) |
設置一個非負值,該值顯示畫控件外圍3D邊界的寬度;(特別的由relief選項決定這項決定).控件內部的3D效果也可以使用該值,該值可以是Tkinter(Tk_GetPixels)接受的任何格式 | pixel |
3 | |
cursor |
指定控件使用的鼠標光標,該值可以是Tkinter(Tk_GetPixels)接受的任何格式 | cursor |
gumby | |
font |
指定控件內部文本的字體 | font |
'Helvetica' ('Verdana',8) |
Canvas Frame Scrollbar Toplevel |
foreground(fg) |
指定控件的前景色 | color | 'black' '#ff2244' |
Canvas Frame Scrollbar Toplevel |
highlightbackground |
指出經過沒有輸入焦點的控件加亮區域顏色 | color | 'gray30' | Menu |
highlightcolor |
指出經過沒有輸入焦點的控件周圍長方區域加亮顏色 | color | 'royalblue' | Menu |
highlightthickness |
設置一個非負值,該值指出一個有輸入焦點的控件周圍加亮方形區域的寬度,該值可以是 Tk_GetCursor)接受的任何格式.如果為0,則不畫加亮區域 | pixel | 2.1m | Menu |
relief |
指出控件3D效果.可選值為RAISED,SUNKEN,FLAT,RIDGE,SOLID,GROOVE.該值指出控件內部相對於外部的外觀樣式,比如RAISED意味着控件內部相對於外部突出 | constant | RAISED GROOVE |
|
takefocus |
決定窗口在鍵盤遍歷時是否接收焦點(比如Tab,shift-Tab).在設定焦點到一個窗口之前,遍歷腳本檢查takefocus選項的值,值0意味着鍵盤遍歷時完全跳過,值1意味着只要有輸入焦點(它及所有父代都映射過)就接收.空值由腳本自己覺定是否接收,當前的算法是如果窗口被禁止,或者沒有鍵盤捆綁或窗口不可見時,跳過 | boolean | 1 YES | |
width |
指定一個整數,設置控件寬度,控件字體的平局字符數.如果值小於等於0,控件選擇一個能夠容納目前字符的寬度 |
integer |
32 |
Menu |
很多控件共享的選項:
選項(別名) |
說明 |
單位 |
典型值 |
僅此類控件 |
activebackground | 指定畫活動元素的背景顏色.元素(控件或控件的一部分)在鼠標放在其上並按動鼠標按鈕引起某些行為的發生時,是活動的.如果嚴格的Modf一致性請求通過設置tk_strictModf變量完成,該選項將被忽略,正常背景色將被使用.對Windows和Macintosh系統,活動顏色將只有在鼠標按鈕1被按過元素時使用 | color | 'red' '#fa07a3' |
Button Checkbutton Menu Menubutton Radiobutton Scale Scrollbar |
activeforeground | 指定畫活動元素時的前景顏色.參見上面關於活動元素的定義 | color | 'cadeblue' | Button Menu Checkbutton Menubutton Radiobutton |
anchor | 指出控件信息(比如文本或者位圖)如何在控件中顯示.必須為下面值之一: N,NE,E,SE,S,SW,W,NW或者CENTER.比如NW(NorthWest)指顯示信息時使左上角在控件的左上端 |
constant | Button Checkbutton Label Message Menubutton Radiobutton |
|
bitmap | 指定一個位圖在控件中顯示,以Tkinter(Tk_GetBitmap)接受的任何形式.位圖顯示的精確方式受其他選項如錨或對齊的影響.典型的,如果該選項被指定,它覆蓋指定顯示控件中文本的其他選;bitmap選項可以重設為空串以使文本能夠被顯示在控件上.在同時支持位圖和圖像的控件中,圖像通常覆蓋位圖 | bitmap | Button Checkbutton Label Menubutton Radiobutton |
|
command | 指定一個與控件關聯的命令.該命令通常在鼠標離開控件之時被調用,對於單選按鈕和多選按鈕,tkinter變量(通過變量選項設置)將在命令調用時更新 | command | setupData | Button Checkbutton Radiobutton Scale Scrollbar |
disabledforeground | 指定繪畫元素時的前景色.如果選項為空串(單色顯示器通常這樣設置),禁止的元素用通常的前景色畫,但是采用點刻法填充模糊化 | color | 'gray50' | Button |
height | 指定窗口的高度,采用字體選項中給定字體的字符高度為單位,至少為1 | integer | 1 4 | Button Canvas Frame Label Listbox Checkbutton Radiobutton Menubutton Text Toplevel |
image | 指定所在控件中顯示的圖像,必須是用圖像create方法產生的.如果圖像選項設定,它覆蓋已經設置的位圖或文本顯示;更新恢復位圖或文本的顯示需要設置圖像選項為空串 | image | Button Checkbutton Label Menubutton Radiobutton |
|
justify | 當控件中顯示多行文本的時候,該選項設置不同行之間是如何排列的,其值為如下之一: LEFT,CENTER或RIGHT.LEFT指每行向左對齊,CENTER指每行居中對齊,RIGHT指向右對齊 |
constant | RIGHT | Button Checkbutton Entry Label Menubutton Message Radiobutton |
padx | 指定一個非負值設置控件X方向需要的邊距.該值為Tkinter(Tk_GetPixels)接受的格式.當計算需要多大的窗口時,控件會把此值加到正常大小之上(由控件中顯示內容決定);如果幾何管理器能夠滿足此請求,控件將在左端或右端得到一個給定的多余空邊.大部分控件只用此項於文本,如果它們顯示位圖或圖像,通常忽略空邊選項 | pixels | 2m 10 | Button Checkbutton Label Menubutton Message Radiobutton Text |
pady | 指定一個非負值設置控件Y方向需要的邊距.該值為Tkinter(Tk_GetPixels)接受的格式.當計算需要多大的窗口時,控件會把此值加到正常大小之上(由控件中顯示內容決定);如果幾何管理器能夠滿足此請求,控件將在上端或下端得到一個給定的多余空邊.大部分控件只用此項於文本,如果它們顯示位 圖或圖像,通常忽略空邊選項 | pixels | 12 3m | Button Checkbutton Label Menubutton Message Radiobutton Text |
selectbackground | 指定顯示選中項時的背景顏色 | color | blue | Canvas Listbox Entry Text |
selectborderwidth | 指定一個非負值,給出選中項的三維邊界寬度,值可以是任何 Tkinter(Tk_GetPixels)接受的格式 |
pixel | 3 | Canvas |
selectforeground | 指定顯示選中項的前景顏色 | color | yellow | Canvas Entry Listbox Text |
state | 指定控件下列兩三個狀態之一(典型是復選按鈕): |
constant | ACTIVE | Button |
text | 指定控件中顯示的文本,文本顯示格式由特定控件和其他諸如錨和對齊選項決定 | string | 'Display' | Button Checkbutton Label Menubutton Message Radiobutton |
textvariable | 指定一個變量名字.變量值被轉變為字符串在控件上顯示.如果變量值改變,控件將自動更新以反映新值,字符串顯示格式由特定控件和其他諸如錨和對齊選項決定 | variable | widgetConstant | Button Checkbutton Entry Label Menubutton Message Radiobutton |
underline | 指定控件中加入下划線字符的整數索引.此選項完成菜單按鈕與菜單輸入的鍵盤遍歷缺省捆綁.0對應控件中顯示的第一個字符,1對應第二個,以此類推 | integer | 2 | Button CheckButton Label Menubutton Radiobutton |
wraplength | 對於能夠支持字符換行的控件,該選項指定行的最大字符數,超過最大字符數的行將轉到下行顯示,這樣一行不會超過最大字符數.該值可以是窗口距離的任何標准格式.如果該值小於或等於0,不換行,換行只有在文本中的換行符的地方才出現 | pixel | 41,65 | Button Checkbutton Label Menubutton Radiobutton |
xscrollcommand | 指定一個用來與水平滾動框進行信息交流的命令前綴,當控件窗口視圖改變(或者別的任何滾動條顯示的改變,如控件的總尺寸改變等等),控件將通過把滾動命令和兩個數連接起來產生一個命令.兩個數分別為0到1之間的分數,代表文檔中的一個位置,0表示文檔的開頭,1.0表示文檔的結尾處,0.333表示整個文檔的三分之一處,如此等等.第一個分數代表窗口中第一個可見文檔信息,第二個分數代表緊跟上一個可見部分之后的信息.然后命令把它們傳到Tcl解釋器執行. 典型的,xscrollcommand選項由滾動條標識跟着set組成,如set.x.scrollbar set將引起滾動條在窗口中視圖變化時被更新.如果此項沒有指定,不執行命令 |
function | Canvas Entry Listbox Text |
|
yscrollcommand | 指定一個用來與垂直滾動框進行信息交流的命令前綴,當控件窗口視圖改變(或者別的任何滾動條顯示的改變,如控件的總尺寸改變等等),控件將通過把滾動命令和兩個數連接起來產生一個命令.兩個數分別為0到1之間的分數,代表文檔中的一個位置,0表示文檔的開頭,1.0表示文檔的結尾處,0.333表示整個文檔的三分之一處,如此等等.第一個分數代表窗口中第一個可見文檔信息,第二個分數代表緊跟上一個可見部分之后的信息.然后命令把它們傳到Tcl解釋器執行. 典型的,yscrollcommand選項由滾動條標識跟着set組成,如set.y.scrollbar set將引起滾動條在窗口中視圖變化時被更新.如果此項沒有指定,不執行命令 |
function | Canvas Entry Listbox Text |
資料來源——《Python與Tkinter編程》附錄B