tkinter:tkinter是綁定了Python的TKGUI工具集,就是Python包裝的Tcl代碼,經過內嵌在Python解釋器內部的Tcl
解釋器實現的,它是Python標準庫的一部分,因此使用它進行GUI編程不須要另外安裝第三方庫的。python
tkinter的簡單使用:編程
1 #_*_ coding:utf-8 _*_ 2 import tkinter #導入tkinter模塊 3 4 root = tkinter.Tk() #生成root主窗口 5 label = tkinter.Label(root,text = "Hello,tkinter!") #生成標籤 6 label.pack() #將標籤添加到root主窗口 7 button1 = tkinter.Button(root,text = "button1") #生成button1 8 button1.pack(side = tkinter.LEFT) #將button1添加到root主窗口 9 button2 = tkinter.Button(root,text = "button2") #生成button2 10 button2.pack(side = tkinter.RIGHT) #將button2添加到root主窗口 11 root.mainloop() #進入信息循環
tkinter組件:canvas
佈局組件:
組件pack方法參數設置組件的位置:
before:將組件置於其餘之間以前;
after:將組件置於其餘組件以後;
side:組件在主窗口的位置,能夠爲「top」、「bottom」、「left」、「right」;
anchor:組件的對齊方式,頂對齊「n」、底對齊「s」、左對齊「w」、右對齊「e」;ide
組件anchor方法參數經過行列的方法設置組件的位置:
column:組件所在的列起始位置;
columspam:組件的列寬;
row:組件所在的行起始位置;
rowspam:組件的行寬;函數
組件place方法參數經過座標來設置組件的位置:工具
經常使用tkinter組件:
按鈕:oop
1 #_*_ coding:utf-8 _*_ 2 import tkinter #導入tkinter模塊 3 4 root = tkinter.Tk() #生成root主窗口 5 label = tkinter.Label(root,text = "Hello,tkinter!") #生成標籤 6 label.pack() #將標籤添加到root主窗口 7 button1 = tkinter.Button(root, 8 anchor = tkinter.E, #指定文本對齊方式 9 text = "button1", #指定按鈕上的文本 10 width = 40, #指定按鈕的寬度,至關於40個字符 11 height = 5) #指定按鈕的高度,至關於5行字符 12 button1.pack() #將按鈕添加到窗口 13 button2 = tkinter.Button(root, 14 text = "button2", 15 bg = "blue") #指定按鈕的背景顏色 16 button2.pack() 17 button3 = tkinter.Button(root, 18 text = "button1", 19 width = 60, 20 height = 5, 21 state = tkinter.DISABLED) #指定按鈕爲禁用狀態 22 button3.pack() 23 root.mainloop() #進入信息循環
文本框:佈局
1 #_*_ coding:utf-8 _*_ 2 import tkinter #導入tkinter模塊 3 4 root = tkinter.Tk() 5 entry1 = tkinter.Entry(root, #生成單行文本框組件 6 show = '*') #輸入文本框中的字符被顯示爲「*」 7 entry1.pack() #將文本框添加到窗口中 8 entry2 = tkinter.Entry(root, 9 show = '#', #輸入文本框中的字符被顯示爲「#」 10 width = 50) #將文本框的寬度設置爲50 11 entry2.pack() 12 entry3 = tkinter.Entry(root, 13 bg = 'red', #將文本框的背景色設置爲紅色 14 fg = 'blue') #將文本框的前景色設置爲藍色 15 entry3.pack() 16 entry4 = tkinter.Entry(root, 17 selectbackground = 'red', #將選中文本的背景色設置爲紅色 18 selectforeground = 'gray') #將選中文本的前景色設置爲灰色 19 entry4.pack() 20 entry5 = tkinter.Entry(root, 21 state = tkinter.DISABLED) #將文本框設置爲禁用 22 entry5.pack() 23 edit1 = tkinter.Text(root, #生成多行文本框組件 24 selectbackground='red', #將選中文本的背景色設置爲紅色 25 selectforeground='gray') #將選中文本的前景色設置爲灰色 26 edit1.pack() 27 root.mainloop() #進入信息循環
標籤:post
1 #_*_ coding:utf-8 _*_ 2 import tkinter #導入tkinter模塊 3 4 root = tkinter.Tk() 5 label1 = tkinter.Label(root, 6 anchor = tkinter.E, #設置文本的位置 7 bg = 'blue', #設置標籤背景色 8 fg = 'red', #設置標籤前景色 9 text = 'Python', #設置標籤中的文本 10 width = 30, #設置標籤的寬度爲30 11 height = 5) #設置標籤的高度爲5 12 label1.pack() 13 label2 = tkinter.Label(root, 14 text = 'Python GUI\ntkinter', #設置標籤中的文本,在字符串中使用換行符 15 justify = tkinter.LEFT, #設置多行文本爲左對齊 16 width = 30, 17 height = 5) 18 label2.pack() 19 label3 = tkinter.Label(root, 20 text = 'Python GUI\ntkinter', 21 justify = tkinter.RIGHT, #設置多行文本爲右對齊 22 width = 30, 23 height = 5) 24 label3.pack() 25 label4 = tkinter.Label(root, 26 text = 'Python GUI\ntkinter', 27 justify = tkinter.CENTER, #設置多行文本爲居中對齊 28 width = 30, 29 height = 5) 30 label4.pack() 31 root.mainloop()
菜單:ui
1 #_*_ coding:utf-8 _*_ 2 import tkinter #導入tkinter模塊 3 4 root = tkinter.Tk() 5 menu = tkinter.Menu(root) #生成菜單 6 submenu = tkinter.Menu(menu,tearoff = 0) #生成下拉菜單 7 submenu.add_command(label = 'Open') #向下拉菜單中添加Open命令 8 submenu.add_command(label = 'Save') #向下拉菜單中添加Save命令 9 submenu.add_command(label = 'Close') #向下拉菜單中添加Close命令 10 menu.add_cascade(label = 'File',menu = submenu) #將下拉菜單添加到菜單中 11 submenu = tkinter.Menu(menu,tearoff = 0) #生成下拉菜單 12 submenu.add_command(label = 'Copy') #向下拉菜單中添加Copy命令 13 submenu.add_command(label = 'Paste') #向下拉菜單中添加Paste命令 14 submenu.add_separator() #向下拉菜單中添加分隔符 15 submenu.add_command(label = 'Cut') #向下拉菜單中添加Cut命令 16 menu.add_cascade(label = 'Edit',menu = submenu) #將下拉菜單添加到菜單中 17 submenu = tkinter.Menu(menu,tearoff = 0) #生成下拉菜單 18 submenu.add_command(label = 'About') #向下拉菜單中添加About命令 19 menu.add_cascade(label = 'Help',menu = submenu) #將下拉菜單添加到菜單中 20 root.config(menu = menu) 21 root.mainloop()
1 #_*_ coding:utf-8 _*_ 2 import tkinter #導入tkinter模塊 3 4 root = tkinter.Tk() 5 menu = tkinter.Menu(root,tearoff = 0) #建立菜單 6 menu.add_command(label = 'Copy') #向彈出式菜單中添加Copy命令 7 menu.add_command(label = 'Paste') #向彈出式菜單中添加Paste命令 8 menu.add_separator() #向彈出式菜單中添加分隔符 9 menu.add_command(label = 'Cut') #向彈出式菜單中添加Cut命令 10 def popupmenu(event): #定義右鍵事件處理函數 11 menu.post(event.x_root,event.y_root) #顯示菜單 12 root.bind('<Button-3>',popupmenu) #在主窗口中綁定右鍵事件 13 root.mainloop()
單選框和複選框:
1 #_*_ coding:utf-8 _*_ 2 import tkinter #導入tkinter模塊 3 4 root = tkinter.Tk() 5 r = tkinter.StringVar() #使用StringVar生成字符串變量用於單選框組件 6 r.set('1') #初始化變量 7 radio = tkinter.Radiobutton(root, #生成單選框組件 8 variable = r, #設置單選框關聯的變量 9 value = '1', #設置選中單選框時其所關聯的變量的值,即r的值 10 indicatoron = 0, #將單選框繪製成按鈕樣式 11 text = 'Radio1') #設置單選框顯示的文本 12 radio.pack() 13 radio = tkinter.Radiobutton(root, 14 variable = r, 15 value = '2', 16 indicatoron = 0, 17 text = 'Radio2') 18 radio.pack() 19 radio = tkinter.Radiobutton(root, 20 variable = r, 21 value = '3', 22 indicatoron = 0, 23 text = 'Radio3') 24 radio.pack() 25 radio = tkinter.Radiobutton(root, 26 variable = r, 27 value = '4', 28 indicatoron = 0, 29 text = 'Radio4') 30 radio.pack() 31 c = tkinter.IntVar() #使用InVar生成整型變量用於複選框 32 c.set(1) 33 check = tkinter.Checkbutton(root, 34 text = 'Checkbutton', #設置複選框的文本 35 variable = c, #設置複選框關聯的變量 36 indicatoron = 0, #將單選框繪製成按鈕樣式,不加爲單選按鈕 37 onvalue = 1, #當選中複選框時,c的值爲1 38 offvalue = 2) #當未選中複選框時,c的值爲2 39 check.pack() 40 root.mainloop() 41 print(r.get()) #輸出r的值 42 print(c.get()) #輸出c的值
繪圖:
1 #_*_ coding:utf-8 _*_ 2 import tkinter #導入tkinter模塊 3 4 root = tkinter.Tk() 5 canvas = tkinter.Canvas(root, 6 width = 600, #指定Canvas組件的寬度爲600 7 height = 480, #指定Canvas組件的高度爲480 8 bg = 'white') #指定Canvas組件背景色爲白色 9 im = tkinter.PhotoImage(file = 'python.gif') #使用PhotoImage打開圖片 10 canvas.create_image(300,50,image = im) #使用create_image將圖片添加到Canvas組件中 11 canvas.create_text(302,77, #使用create_text方法繪製文字 12 text = 'Use Canvas', #所繪製文字的內容 13 fill = 'gray') #所繪製文字的顏色爲灰色 14 canvas.create_text(300,75, 15 text = 'Use Canvas', 16 fill = 'blue') 17 canvas.create_polygon(290,114,316,114,330,130, #使用create_polygon方法繪製六邊形 18 310,146,284,146,270,130) 19 canvas.create_oval(280,120,320,140, #使用create_oval方法繪製橢圓形 20 fill = 'white') #設置橢圓用白色填充 21 canvas.create_line(250,130,350,130) #使用create_line繪製直線 22 canvas.create_line(300,100,300,160) 23 canvas.create_rectangle(90,190,510,410, #使用create_rectangle繪製一個矩形 24 width = 5) #設置矩形線寬爲5像素 25 canvas.create_arc(100,200,500,400, #使用create_arc繪製圓弧 26 start = 0,extent = 240, #設置圓弧的起止角度 27 fill = 'pink') #設置圓弧填充顏色爲粉絲 28 canvas.create_arc(103,203,500,400, 29 start = 241,extent = 118, 30 fill = 'red') 31 canvas.pack() #將canvas添加到主窗口 32 root.mainloop()
事件:
鼠標事件、鍵盤事件、窗口事件,綁定事件的組件:
bind(sequence,func,add)
bind_class(classname,sequence,func,add)
bind_all(sequence,func,add)
參數含義:
sequence:所綁定的事件,必須以「<>」包圍的字符串
func:所綁定的事件處理函數
add:可選參數,爲空字符或者「+」
classname:所綁定的類
備註:鼠標事件數字1表示鼠標左鍵、2表示鼠標中鍵、3表示鼠標右鍵
鍵盤事件:
備註:KeyPress能夠用KeyRelease替換,表示當按鍵釋放時觸發事件。須要注意的是,輸入的字母要區分大小寫
窗口事件:
相應事件:
事件綁定到函數後,觸發時系統將向該函數傳遞一個event對象的參數,event對象屬性:
1 #_*_ coding:utf-8 _*_ 2 import tkinter 3 4 class MyButton: #定義按鈕類 5 def __init__(self,root,canvas,label,type): #類初始化 6 self.root = root #保存引用值 7 self.cancas = canvas 8 self.label = label 9 if type == 0: #根據類型建立按鈕 10 button = tkinter.Button(root,text = 'DrawLine', 11 command = self.DrawLine) 12 elif type == 1: 13 button = tkinter.Button(root, text='DrawArc', 14 command=self.DrawArc) 15 elif type == 2: 16 button = tkinter.Button(root, text='DrawRec', 17 command=self.DrawRec) 18 else: 19 button = tkinter.Button(root, text='DrawOval', 20 command=self.DrawOval) 21 button.pack(side = 'left') 22 def DrawLine(self): #DrawLine按鈕事件處理函數 23 self.label.text.set('Draw Line') 24 self.cancas.SetStatus(0) 25 def DrawArc(self): #DrawArc按鈕事件處理函數 26 self.label.text.set('Draw Arc') 27 self.cancas.SetStatus(1) 28 def DrawRec(self): #DrawRec按鈕事件處理函數 29 self.label.text.set('Draw Rectangle') 30 self.cancas.SetStatus(2) 31 def DrawOval(self): #DrawOval按鈕事件處理函數 32 self.label.text.set('Draw Oval') 33 self.cancas.SetStatus(3) 34 class MyCanvas: #定義MyCanvas類 35 def __init__(self,root): #保存引用值 36 self.status = 0 37 self.draw = 0 38 self.root = root 39 self.canvas = tkinter.Canvas(root,bg = 'white', #生成Canvas組件 40 width = 600, 41 height = 480) 42 self.canvas.pack() 43 self.canvas.bind('<ButtonRelease-1>',self.Draw) #綁定事件到左鍵 44 self.canvas.bind('<Button-2>',self.Exit) #綁定事件到中鍵 45 self.canvas.bind('<Button-3>',self.Del) #綁定事件到右鍵 46 self.canvas.bind_all('<Delete>',self.Del) #綁定事件到Delete鍵 47 self.canvas.bind_all('<KeyPress-d>',self.Del) #綁定事件到d鍵 48 self.canvas.bind_all('<KeyPress-e>',self.Exit) #綁定事件到e鍵 49 def Draw(self,event): #繪製事件處理函數 50 if self.draw == 0: #判斷是否繪圖 51 self.x = event.x 52 self.y = event.y 53 self.draw = 1 54 else: #根據self.status繪製不一樣的圖形 55 if self.status == 0: 56 self.canvas.create_line(self.x,self.y, 57 event.x,event.y) 58 self.draw = 0 59 elif self.status == 1: 60 self.canvas.create_arc(self.x, self.y, 61 event.x, event.y) 62 self.draw = 0 63 elif self.status == 2: 64 self.canvas.create_rectangle(self.x, self.y, 65 event.x, event.y) 66 self.draw = 0 67 else: 68 self.canvas.create_oval(self.x, self.y, 69 event.x, event.y) 70 self.draw = 0 71 def Del(self,event): #按下右鍵或d鍵則刪除圖形 72 items = self.canvas.find_all() 73 for item in items: 74 self.canvas.delete(item) 75 def Exit(self,event): #按下中鍵或e鍵則退出 76 self.root.quit() 77 def SetStatus(self,status): #設置繪製的圖形 78 self.status = status 79 class MyLabel: #定義標籤類 80 def __init__(self,root,canvas): #類初始化 81 self.root = root #保存引用值 82 self.canvas = canvas 83 self.text = tkinter.StringVar() #生成標籤引用變量 84 self.text.set('Draw Line') 85 self.label = tkinter.Label(root,textvariable = self.text, #生成標籤 86 fg = 'red',width = 50) 87 self.label.pack(side = 'left') 88 root = tkinter.Tk() #生成主窗口 89 canvas = MyCanvas(root) #生成繪圖組件 90 label = MyLabel(root,canvas) #生成標籤 91 MyButton(root,canvas,label,0) #生成按鈕 92 MyButton(root,canvas,label,1) 93 MyButton(root,canvas,label,2) 94 MyButton(root,canvas,label,3) 95 root.mainloop() #進入信息循環
信息框:
1 #_*_ coding:utf-8 _*_ 2 import tkinter 3 import tkinter.messagebox 4 def cmd(): #按鈕信息處理 5 global n #使用全局變量n 6 global buttontext 7 n = n + 1 8 if n == 1: #判斷n的值,顯示不一樣的消息框 9 tkinter.messagebox.askokcancel('Python tkinter','askokcancel') 10 buttontext.set('skquestion') #更改按鈕上的文字 11 elif n == 2: 12 tkinter.messagebox.askquestion('Python tkinter','askquestion') 13 buttontext.set('askyesno') 14 elif n == 3: 15 tkinter.messagebox.askyesno('Python tkinter','askyesno') 16 buttontext.set('showerror') 17 elif n == 4: 18 tkinter.messagebox.showerror('Python tkinter','showerror') 19 buttontext.set('showinfo') 20 elif n == 5: 21 tkinter.messagebox.showinfo('Python tkinter','shoeinfo') 22 buttontext.set('showwarning') 23 else: 24 n = 0 #將n賦值爲0從新開始循環 25 tkinter.messagebox.showwarning('Python tkinter','showwarning') 26 buttontext.set('askokcancel') 27 n = 0 #爲n賦初始值 28 root = tkinter.Tk() 29 buttontext = tkinter.StringVar() #生成關聯按鈕文字的變量 30 buttontext.set('askokcancel') #設置buttontext值 31 button = tkinter.Button(root, #生成按鈕 32 textvariable = buttontext, #設置關聯變量 33 command = cmd) #設置事件處理函數 34 button.pack() 35 root.mainloop() #進入信息循環
除了5種信息框,還能夠使用tkinter.messagebox._show函數建立其餘類型的信息框
tkinter.messagebox._show函數的控制參數:
default:指定信息框的按鈕
icon:指定信息框的圖標
message:指定信息框所顯示的信息
parent:指定信息框的父組件
title:指定信息框的標題
type:指定信息框的類型
對話框:
tkinter.simpledialog模塊能夠建立標準的輸入對話框
tkinter.simpledialog模塊能夠建立3中類型的對話框:
輸入字符串、輸入整數和輸入浮點數的對話框,對應的函數爲askstring、askinteger、和askfloat函數,可選參數有:
title:指定對話框標題
prompt:指定對話框中顯示的文字
initiavalue:指定輸入框的初始值
使用tkinter.simpledialog模塊中的函數建立對話框後,將返回對話框中文本框的值
1 #_*_ coding:utf-8 _*_ 2 import tkinter 3 import tkinter.simpledialog 4 def InStr(): #按鈕事件處理函數 5 r = tkinter.simpledialog.askstring('Python tkinter', #建立字符串輸入對話框 6 'Input String', #指定提示字符 7 initialvalue = 'tkinter') #指定初始化文本 8 print(r) #輸出返回值 9 def InInt(): 10 r = tkinter.simpledialog.askinteger('Python tkinter', 11 'Input Integer') 12 print(r) 13 def InFlo(): 14 r = tkinter.simpledialog.askfloat('Python tkinter', 15 'Input Float') 16 print(r) 17 root = tkinter.Tk() #生成主窗口 18 button1 = tkinter.Button(root,text = 'Input String', #建立按鈕 19 command = InStr) #指定按鈕事件處理函數 20 button1.pack(side = 'left') 21 button2 = tkinter.Button(root,text = 'Input Integer', 22 command = InInt) 23 button2.pack(side = 'left') 24 button3 = tkinter.Button(root,text = 'Input Float', 25 command = InFlo) 26 button3.pack(side = 'left') 27 root.mainloop() #進入信息循環
tkinter.filedialog模塊能夠建立文件打開與保存文件對話框
tkinter.filedialog模塊中的askopenfilename函數能夠建立打開文件對話框
tkinter.filedialog模塊中的asksaveasfilename函數能夠建立保存文件對話框,具備相同可先參數:
filetypes:指定文件類型
initialdir:指定默認目錄
initialfile:指定默認文件
title:指定對話框標題
使用tkFileDialog模塊中的函數建立對話框後,將返回文件的完整路徑
1 #_*_ coding:utf-8 _*_ 2 import tkinter 3 import tkinter.filedialog 4 def FileOpen(): #按鈕事件處理函數 5 r = tkinter.filedialog.askopenfilename(title = 'Python tkinter', #建立打開文件對話框 6 filetypes = [('Python','*.py *.pyw'),('All files','*')]) #指定文件類型爲Python程序 7 print(r) #輸出返回值 8 def FileSave(): #按鈕事件處理函數 9 r = tkinter.filedialog.asksaveasfilename(title = 'Python tkinter', #建立保存文件對話框 10 initialdir = r'F:\python', #指定初始化目錄 11 initialfile = 'test.py') #指定初始化文件 12 print(r) 13 root = tkinter.Tk() 14 button1 = tkinter.Button(root,text = 'File Open', #建立按鈕 15 command = FileOpen) #指定按鈕事件處理函數 16 button1.pack(side = 'left') 17 button2 = tkinter.Button(root,text = 'File Save', 18 command = FileSave) 19 button2.pack(side = 'left') 20 root.mainloop() #進入信息循環
tkinter.colorchooser模塊能夠建立顏色選擇對話框
tkinter.colorchooser模塊中的askcolor函數能夠建立顏色選擇對話框,可選參數:
initialcolor:指定初始化顏色
title:指定對話框標題
使用tkinter.colorchooser模塊中的函數建立對話框後,將返回顏色的RGB值以及能夠在Python tkinter中使用的顏色字符值
1 #_*_ coding:utf-8 _*_ 2 import tkinter 3 import tkinter.colorchooser 4 def ChooseColor(): #按鈕事件處理函數 5 r = tkinter.colorchooser.askcolor(title = 'Python tkinter') #建立顏色選擇對話框 6 print(r) #輸出返回值 7 root = tkinter.Tk() #生成主窗口 8 button = tkinter.Button(root,text = 'Choose Color', #建立按鈕 9 command = ChooseColor) #指定按鈕事件處理函數 10 button.pack() 11 root.mainloop() #進入信息循環
自定義對話框:
Toplevel組件:
1 #_*_ coding:utf-8 _*_ 2 import tkinter 3 import tkinter.messagebox 4 class MyDialog: #定義對話框類 5 def __init__(self,root): #對話框初始化 6 self.top = tkinter.Toplevel(root) #生成Toplevel組件 7 label = tkinter.Label(self.top,text = 'Please Input') #生成標籤組件 8 label.pack() 9 self.entry = tkinter.Entry(self.top) #生成文本框組件 10 self.entry.pack() 11 self.entry.focus() #讓文本框得到焦點 12 button = tkinter.Button(self.top,text = 'Ok', #生成按鈕 13 command = self.Ok) #設置按鈕事件處理函數 14 button.pack() 15 def Ok(self): #定義按鈕事件處理函數 16 self.input = self.entry.get() #獲取文本框中的內容,保存爲input 17 self.top .destroy() #銷燬對話框 18 def get(self): #返回在文本框輸入的內容 19 return self.input 20 class MyButton(): #定義按鈕類 21 def __init__(self,root,type): #按鈕初始化 22 self.root = root #保存父窗口引用 23 if type == 0: #根據類型建立不一樣按鈕 24 self.button = tkinter.Button(root, 25 text = 'Create', 26 command = self.Create) #設置Create按鈕事件處理函數 27 else: 28 self.button = tkinter.Button(root, 29 text = 'Quit', 30 command = self.Quit) #設置Quit按鈕事件處理函數 31 self.button.pack() 32 def Create(self): #Create按鈕的事件處理函數 33 d = MyDialog(self.root) #生成對話框 34 self.button.wait_window(d.top) #等待對話框結束 35 tkinter.messagebox.showinfo('Python','You input:\n' + d.get()) #獲取對話框中輸入值,並輸出 36 def Quit(self): #Quit按鈕的事件處理函數 37 self.root.quit() #退出主窗口 38 root = tkinter.Tk() #生成主窗口 39 MyButton(root,0) #生成Create 40 MyButton(root,1) #生成Quit按鈕 41 root.mainloop() #進入信息循環