什么是Tkinter?Tkinter 是 Python 的標(biāo)準(zhǔn) GUI 庫(kù)。Python 使用 Tkinter 可以快速的創(chuàng)建 GUI 應(yīng)用程序。 由于 Tkinter 是內(nèi)置到 python 的安裝包中、只要安裝好 Python 之后就能 import Tkinter 庫(kù)、而且 IDLE 也是用 Tkinter 編寫而成、對(duì)于簡(jiǎn)單的圖形界面 Tkinter 還是能應(yīng)付自如。 使用導(dǎo)入 import tkinter 注意:Python3.x 版本使用的庫(kù)名為 tkinter,即首寫字母 T 為小寫。 創(chuàng)建一個(gè)GUI程序
#!/usr/bin/python3import tkintertop = tkinter.Tk()# 進(jìn)入消息循環(huán)top.mainloop() 窗口主體框架每一個(gè) tkinter 應(yīng)用的主體框架都可以包含下面這部分. 定義 import tkinter as tkwindow = tk.Tk()window.title('my window')window.geometry('500x500')#注意:這里的乘是×不是*# 這里是窗口的內(nèi)容window.mainloop() 窗口內(nèi)容Label & Button 標(biāo)簽和按鈕這次我們會(huì)建立一個(gè)用來(lái)描述的標(biāo)簽 import tkinter as tk#創(chuàng)建窗口window=tk.Tk()window.title('Mywindow')#窗口的標(biāo)題window.geometry('200x100')#窗口的大小#定義一個(gè)labell = tk.Label(window,text='Hi! this is TK!', # 標(biāo)簽的文字bg='green', # 標(biāo)簽背景顏色font=('Arial', 12), # 字體和字體大小width=15, height=2 # 標(biāo)簽長(zhǎng)寬(以字符長(zhǎng)度計(jì)算))l.pack() # 固定窗口位置window.mainloop() 關(guān)于Label的更多內(nèi)容可以看這里https://www.runoob.com/python/python-tk-label.html 我們也可以通過(guò)變量的形式控制標(biāo)簽的顯示, 這時(shí)我們引入按鈕 var = tk.StringVar() # 這時(shí)文字變量?jī)?chǔ)存器l = tk.Label(window,textvariable=var, # 使用 textvariable 替換 text, 因?yàn)檫@個(gè)可以變化bg='green', font=('Arial', 12), width=15, height=2)l.pack() 接著我們來(lái)做 按鈕 b = tk.Button(window,text='hit me', # 顯示在按鈕上的文字width=15, height=2,command=hit_me) # 點(diǎn)擊按鈕式執(zhí)行的命令b.pack() # 按鈕位置 那么點(diǎn)擊是的命令我們用 on_hit = False # 默認(rèn)初始狀態(tài)為 Falsedef hit_me():global on_hitif on_hit == False: # 從 False 狀態(tài)變成 True 狀態(tài)on_hit = Truevar.set('you hit me') # 設(shè)置標(biāo)簽的文字為 'you hit me'else: # 從 True 狀態(tài)變成 False 狀態(tài)on_hit = Falsevar.set('') # 設(shè)置 文字為空 完整代碼: import tkinter as tk#創(chuàng)建窗口window=tk.Tk()window.title('Mywindow')#窗口的標(biāo)題window.geometry('200x100')#窗口的大小#定義一個(gè)labelvar=tk.StringVar()#定義一個(gè)字符串變量l = tk.Label(window,textvariable=var, # 標(biāo)簽的文字bg='green', # 標(biāo)簽背景顏色font=('Arial', 12), # 字體和字體大小width=15, height=2 # 標(biāo)簽長(zhǎng)寬)l.pack() # 固定窗口位置#定義一個(gè)全局變量,來(lái)表明字符顯示與不顯示on_hit=False#按鈕的函數(shù)def hit_me():global on_hit#聲明全局變量if on_hit==False:on_hit=Truevar.set('You hit me!')else:on_hit=Falsevar.set('')#按鈕b=tk.Button(window,text='點(diǎn)我',width=15,height=2,command=hit_me)#點(diǎn)擊按鈕執(zhí)行一個(gè)名為“hit_me”的函數(shù)b.pack()window.mainloop() 沒有點(diǎn)擊時(shí): 點(diǎn)擊第一次: 點(diǎn)擊第二次: Entry & Text 輸入, 文本框窗口主體框架每一個(gè)tkinter應(yīng)用的主體框架都包含以下幾部分:
import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')##顯示出來(lái)window.mainloop() 窗口內(nèi)容(窗口上的控件)創(chuàng)建按鈕分別觸發(fā)兩種情況 b1 = tk.Button(window,text="insert point",width=15,height=2,command=insert_point)b1.pack()b2 = tk.Button(window,text="insert end",command=insert_end)b2.pack() 創(chuàng)建輸入框entry,用戶輸入任何內(nèi)容都顯示為* e = tk.Entry(window,show='*')e.pack() 創(chuàng)建一個(gè)文本框用于顯示 t = tk.Text(window,height=2)t.pack() 定義觸發(fā)事件時(shí)的函數(shù)(注意:因?yàn)镻ython的執(zhí)行順序是從上往下,所以函數(shù)一定要放在按鈕的上面) def insert_point():var = e.get()t.insert('insert',var)def insert_end():var = e.get()t.insert('end',var) 完整代碼: import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')#定義一個(gè)輸入框entrye=tk.Entry(window,show=None)#如果是輸入密碼,可以寫show='*'e.pack()#定義按鈕功能def insert_point():var=e.get()t.insert('insert',var)def insert_end():var=e.get()t.insert('end',var)#這里還可以定義字符串插入的具體位置,比如t.insert('1.1',var),表示插入到第一行第一列 #定義2個(gè)按鈕 Button b1 = tk.Button(window,text="insert point",width=15,height=2,command=insert_point) b1.pack() b2 = tk.Button(window,text="insert end",command=insert_end) b2.pack() #定義一個(gè)文本框 Text t=tk.Text(window,height=2) t.pack() ##顯示出來(lái) window.mainloop() 窗口界面 測(cè)試一下第一次:在entry中輸入 第二次:點(diǎn)擊 Listbox 列表部件創(chuàng)建主窗口import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')##顯示出來(lái)window.mainloop() 創(chuàng)建一個(gè)label用于顯示var1 = tk.StringVar() #創(chuàng)建變量l =tk.Label(window,bg='yellow',width=4,textvariable=var1)l.pack() 創(chuàng)建一個(gè)方法用于按鈕的點(diǎn)擊事件def print_selection():value = lb.get(lb.curselection()) #獲取當(dāng)前選中的文本var1.set(value) #為label設(shè)置值 創(chuàng)建一個(gè)按鈕b1 = tk.Button(window, text='print selection', width=15,height=2, command=print_selection)b1.pack() 創(chuàng)建一個(gè)Listbox和變量var2,并將var2的值賦給Listboxvar2 = tk.StringVar()var2.set((11,22,33,44)) #為變量設(shè)置值#創(chuàng)建Listboxlb = tk.Listbox(window, listvariable=var2) #將var2的值賦給Listbox#創(chuàng)建一個(gè)list并將值循環(huán)添加到Listbox控件中l(wèi)ist_items = [1,2,3,4]for item in list_items:lb.insert('end', item) #從最后一個(gè)位置開始加入值lb.insert(1, 'first') #在第一個(gè)位置加入'first'字符lb.insert(2, 'second') #在第二個(gè)位置加入'second'字符lb.delete(2) #刪除第二個(gè)位置的字符lb.pack() 完整代碼: import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')#創(chuàng)建一個(gè)lablevar1 = tk.StringVar() #創(chuàng)建變量l =tk.Label(window,bg='yellow',width=4,textvariable=var1)l.pack()#按鈕事件def print_selection():value = lb.get(lb.curselection()) #獲取當(dāng)前選中的文本var1.set(value) #為label設(shè)置值#創(chuàng)建一個(gè)按鈕b1 = tk.Button(window, text='print selection', width=15,height=2, command=print_selection)b1.pack()#創(chuàng)建一個(gè)Listbox和變量var2,并將var2的值賦給Listboxvar2 = tk.StringVar()var2.set((11,22,33,44)) #為變量設(shè)置值#創(chuàng)建Listboxlb = tk.Listbox(window, listvariable=var2) #將var2的值賦給Listbox#創(chuàng)建一個(gè)list并將值循環(huán)添加到Listbox控件中l(wèi)ist_items = [1,2,3,4]#定義列表for item in list_items:lb.insert('end', item) #從最后一個(gè)位置開始加入值lb.insert(1, 'first') #在第一個(gè)位置加入'first'字符lb.insert(2, 'second') #在第二個(gè)位置加入'second'字符lb.delete(2) #刪除第二個(gè)位置的字符lb.pack()##顯示出來(lái)window.mainloop() 演示 Radiobutton 選擇按鈕這一次的效果將會(huì)像下面的圖片一樣. 如果選擇了某個(gè)選項(xiàng), 效果就會(huì)如下. radiobutton 部件首先我們需要定義一個(gè) var = tk.StringVar()l = tk.Label(window, bg='yellow', width=20, text='empty')l.pack()r1 = tk.Radiobutton(window, text='Option A',variable=var, value='A',command=print_selection)r1.pack() 其中 觸發(fā)功能我們將定義一個(gè)功能, 用來(lái)對(duì)選擇的 radiobutton 進(jìn)行操作. def print_selection():l.config(text='you have selected ' + var.get()) 當(dāng)觸發(fā)這個(gè)函數(shù)功能時(shí),我們的 完整代碼: import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')#創(chuàng)建一個(gè)lablevar= tk.StringVar() #創(chuàng)建變量l =tk.Label(window,bg='yellow',width=20,height=2,text='empty')l.pack()#實(shí)現(xiàn)將選擇的選項(xiàng)顯示在labledef print_selection():l.config(text='you have selected'+var.get())#創(chuàng)建幾個(gè)Radiobuttonr1 = tk.Radiobutton(window, text='Option A',variable=var, value='A',command=print_selection)r1.pack()r2 = tk.Radiobutton(window, text='Option B',variable=var, value='B',command=print_selection)r2.pack()r3 = tk.Radiobutton(window, text='Option C',variable=var, value='C',command=print_selection)r3.pack()##顯示出來(lái)window.mainloop() 演示: Scale 尺度這一次的效果將會(huì)像下面的圖片一樣. 如果拖動(dòng)滾動(dòng)條, 效果就會(huì)如下. scale 部件s = tk.Scale(window, label='try me', from_=5, to=11, orient=tk.HORIZONTAL,length=200, showvalue=0, tickinterval=2, resolution=0.01, command=print_selection)s.pack() 這里的參數(shù)
參數(shù) 觸發(fā)功能l = tk.Label(window, bg='yellow', width=20, text='empty')l.pack()def print_selection(v):l.config(text='you have selected ' + v) 這里相比前面多了參數(shù) 完整代碼: import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')#創(chuàng)建一個(gè)labell =tk.Label(window,bg='yellow',width=20,height=2,text='empty')l.pack()#實(shí)現(xiàn)將選擇的選項(xiàng)顯示在labledef print_selection(v):l.config(text='you have selected'+v)#創(chuàng)建一個(gè)Scales=tk.Scale(window,label='Try me',from_=5,to=11,orient=tk.HORIZONTAL,length=200,showvalue=1,tickinterval=3,resolution=0.01,command=print_selection)s.pack()##顯示出來(lái)window.mainloop() Checkbutton 勾選項(xiàng)運(yùn)行之后的效果將會(huì)像下面的圖片一樣,此時(shí)不作任何操作. 如果只選中第一個(gè)選項(xiàng),即圖中的python, 效果就會(huì)如下. 如果只選中第二個(gè)選項(xiàng),即圖中的c++, 效果就會(huì)如下. 如果兩個(gè)選項(xiàng)都選中, 效果就會(huì)如下. 如果兩個(gè)選項(xiàng)都不選中, 效果就會(huì)如下. Checkbutton部件var1 = tk.IntVar()c1 = tk.Checkbutton(window, text='Python', variable=var1, onvalue=1, offvalue=0,command=print_selection)c1.pack() 參數(shù) 觸發(fā)功能def print_selection():if (var1.get() == 1) & (var2.get() == 0): #如果選中第一個(gè)選項(xiàng),未選中第二個(gè)選項(xiàng)l.config(text='I love only Python ')elif (var1.get() == 0) & (var2.get() == 1): #如果選中第二個(gè)選項(xiàng),未選中第一個(gè)選項(xiàng)l.config(text='I love only C++')elif (var1.get() == 0) & (var2.get() == 0): #如果兩個(gè)選項(xiàng)都未選中l(wèi).config(text='I do not love either')else:l.config(text='I love both') #如果兩個(gè)選項(xiàng)都選中 相對(duì)于前面學(xué)過(guò)的 完整代碼: import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')#創(chuàng)建一個(gè)lablel =tk.Label(window,bg='yellow',width=20,height=2,text='empty')l.pack()#實(shí)現(xiàn)將選擇的選項(xiàng)顯示在labledef print_selection():if (var1.get() == 1) & (var2.get() == 0): #如果選中第一個(gè)選項(xiàng),未選中第二個(gè)選項(xiàng)l.config(text='I love only Python ')elif (var1.get() == 0) & (var2.get() == 1): #如果選中第二個(gè)選項(xiàng),未選中第一個(gè)選項(xiàng)l.config(text='I love only C++')elif (var1.get() == 0) & (var2.get() == 0): #如果兩個(gè)選項(xiàng)都未選中l(wèi).config(text='I do not love anything')else:l.config(text='I love both') #如果兩個(gè)選項(xiàng)都選中var1=tk.IntVar()var2=tk.IntVar()#創(chuàng)建2個(gè)cheakButtoncl=tk.Checkbutton(window,text='Python',variable=var1,onvalue=1,offvalue=0,command=print_selection)cl.pack()c2=tk.Checkbutton(window,text='C++',variable=var2,onvalue=1,offvalue=0,command=print_selection)c2.pack()##顯示出來(lái)window.mainloop() 演示: Canvas 畫布運(yùn)行之后的效果將會(huì)像下面的圖片一樣. 如果點(diǎn)擊move這個(gè)button, 效果就會(huì)如下. Canvas部件canvas = tk.Canvas(window, bg='blue', height=100, width=200)canvas.pack() 這里的參數(shù)和以往學(xué)過(guò)的部件一樣,所以就不再一一解釋。 如果你想下載那個(gè) instagram 的圖標(biāo), 可以點(diǎn)擊這里下載, 或者直接右鍵保存下面的圖像. image_file = tk.PhotoImage(file='ins.gif')image = canvas.create_image(10, 10, anchor='nw', image=image_file) 這里的代碼主要是實(shí)現(xiàn)我們最終看到的在左上角的那張小圖片。 x0, y0, x1, y1= 50, 50, 80, 80line = canvas.create_line(x0, y0, x1, y1) 這段代碼主要實(shí)現(xiàn)的是畫一條直線,后面 oval = canvas.create_oval(x0, y0, x1, y1, fill='red') #創(chuàng)建一個(gè)圓,填充色為`red`紅色arc = canvas.create_arc(x0+30, y0+30, x1+30, y1+30, start=0, extent=180) #創(chuàng)建一個(gè)扇形rect = canvas.create_rectangle(100, 30, 100+20, 30+20) #創(chuàng)建一個(gè)矩形 這里面就是創(chuàng)建扇形時(shí)多了兩個(gè)沒見過(guò)的參數(shù) 觸發(fā)功能def moveit():canvas.move(rect, 0, 2) 這里的觸發(fā)不再是以往的print_selection了,哈哈,那么這里的是怎么樣的功能呢,首先我們從單詞理解來(lái)看就是移動(dòng)的函數(shù),在視頻中也演示過(guò)了, 就是我們每點(diǎn)一次 完整代碼: import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')#新建畫布#顯示圖片canvas=tk.Canvas(window,bg='blue',height=100,width=200)image_file=tk.PhotoImage(file='ins.gif')image=canvas.create_image(0,0,anchor='nw',image=image_file)#畫線x0,y0,x1,y1=50,50,80,80line=canvas.create_line(x0,y0,x1,y1)#畫?oval=canvas.create_oval(x0,y0,x1,y1,fill='red')#畫一個(gè)扇形arc = canvas.create_arc(x0+30, y0+30, x1+30, y1+30, start=0, extent=90)#畫一個(gè)矩形rect = canvas.create_rectangle(100, 30, 100+20, 30+20)canvas.pack()def moveit():canvas.move(rect,0,2)#創(chuàng)建一個(gè)Buttonb=tk.Button(window,text='Move',command=moveit)b.pack()##顯示出來(lái)window.mainloop() 演示: Menubar 菜單這一次的效果將會(huì)像下面的圖片一樣. 注意這里的操作系統(tǒng)是蘋果的 MacOS, 它的菜單欄位置和 Windows 的不一樣. menubar 部件下面是我們制作整個(gè)菜單欄的流程, 我們先需要加入一個(gè) Menubar 作為整體框架, 然后再在 Menubar 中加一些部件. ##創(chuàng)建一個(gè)菜單欄,這里我們可以把他理解成一個(gè)容器,在窗口的上方menubar = tk.Menu(window)##定義一個(gè)空菜單單元filemenu = tk.Menu(menubar, tearoff=0)##將上面定義的空菜單命名為`File`,放在菜單欄中,就是裝入那個(gè)容器中menubar.add_cascade(label='File', menu=filemenu)##在`File`中加入`New`的小菜單,即我們平時(shí)看到的下拉菜單,每一個(gè)小菜單對(duì)應(yīng)命令操作。##如果點(diǎn)擊這些單元, 就會(huì)觸發(fā)`do_job`的功能filemenu.add_command(label='New', command=do_job)filemenu.add_command(label='Open', command=do_job)##同樣的在`File`中加入`Open`小菜單filemenu.add_command(label='Save', command=do_job)##同樣的在`File`中加入`Save`小菜單filemenu.add_separator()##這里就是一條分割線##同樣的在`File`中加入`Exit`小菜單,此處對(duì)應(yīng)命令為`window.quit`filemenu.add_command(label='Exit', command=window.quit) 同樣的我們?cè)诙x另一個(gè)菜單 submenu = tk.Menu(filemenu)##和上面定義菜單一樣,不過(guò)此處實(shí)在`File`上創(chuàng)建一個(gè)空的菜單filemenu.add_cascade(label='Import', menu=submenu, underline=0)##給放入的菜單`submenu`命名為`Import`submenu.add_command(label="Submenu1", command=do_job)##這里和上面也一樣,在`Import`中加入一個(gè)小菜單命令`Submenu1` 觸發(fā)功能counter = 0def do_job():global counterl.config(text='do '+ str(counter))counter+=1 這里的功能就是每觸發(fā)一次命令,counter就會(huì)+1,在label上的顯示就會(huì)從 do 0 ,do 1 , do 2… 完整代碼: import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')#新建一個(gè)labell=tk.Label(window,text='',bg='yellow')l.pack()#計(jì)數(shù)counter = 0def do_job():global counterl.config(text='do '+ str(counter))counter+=1#創(chuàng)建菜單menubar=tk.Menu(window)#菜單一filemenu=tk.Menu(menubar,tearoff=0)#一級(jí)菜單menubar.add_cascade(label='File',menu=filemenu)#二級(jí)菜單filemenu.add_command(label='New',command=do_job)filemenu.add_command(label='Open',command=do_job)filemenu.add_separator()#分割線filemenu.add_command(label='Exit',command=window.quit)#菜單二editmenu=tk.Menu(menubar,tearoff=0)#一級(jí)菜單menubar.add_cascade(label='Edit',menu=editmenu)#二級(jí)菜單editmenu.add_command(label='Cut',command=do_job)editmenu.add_command(label='Paste',command=do_job)##菜單一子菜單submenu=tk.Menu(filemenu)#一級(jí)菜單filemenu.add_cascade(label='Import',menu=submenu,underline=0)#二級(jí)菜單submenu.add_command(label='Submeau1',command=do_job)submenu.add_command(label='Submeau1',command=do_job)window.config(menu=menubar)##顯示出來(lái)window.mainloop() 演示: Frame 框架這一次的效果將會(huì)像下面的圖片一樣. Frame 部件Frame 是一個(gè)在 Windows 上分離小區(qū)域的部件, 它能將 Windows 分成不同的區(qū),然后存放不同的其他部件. 同時(shí)一個(gè) Frame 上也能再分成兩個(gè) Frame, Frame 可以認(rèn)為是一種容器. ###定義一個(gè)`label`顯示`on the window`tk.Label(window, text='on the window').pack()###在`window`上創(chuàng)建一個(gè)`frame`frm = tk.Frame(window)frm.pack()###在剛剛創(chuàng)建的`frame`上創(chuàng)建兩個(gè)`frame`,我們可以把它理解成一個(gè)大容器里套了一個(gè)小容器,即`frm`上有兩個(gè)`frame` ,`frm_l`和`frm_r`frm_l = tk.Frame(frm)frm_r = tk.Frame(frm)###這里是控制小的`frm`部件在大的`frm`的相對(duì)位置,此處`frm_l`就是在`frm`的左邊,`frm_r`在`frm`的右邊f(xié)rm_l.pack(side='left')frm_r.pack(side='right')###這里的三個(gè)label就是在我們創(chuàng)建的frame上定義的label部件,還是以容器理解,就是容器上貼了標(biāo)簽,來(lái)指明這個(gè)是什么,解釋這個(gè)容器。tk.Label(frm_l, text='on the frm_l1').pack()##這個(gè)`label`長(zhǎng)在`frm_l`上,顯示為`on the frm_l1`tk.Label(frm_l, text='on the frm_l2').pack()##這個(gè)`label`長(zhǎng)在`frm_l`上,顯示為`on the frm_l2`tk.Label(frm_r, text='on the frm_r1').pack()##這個(gè)`label`長(zhǎng)在`frm_r`上,顯示為`on the frm_r1` 完整代碼: import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')###定義一個(gè)`label`顯示`on the window`tk.Label(window, text='on the window').pack()###在`window`上創(chuàng)建一個(gè)`frame`frm = tk.Frame(window,bg='green')frm.pack()###在剛剛創(chuàng)建的`frame`上創(chuàng)建兩個(gè)`frame`,我們可以把它理解成一個(gè)大容器里套了一個(gè)小容器,即`frm`上有兩個(gè)`frame` ,`frm_l`和`frm_r`frm_l = tk.Frame(frm,bg='red')frm_r = tk.Frame(frm,bg='blue')###這里是控制小的`frm`部件在大的`frm`的相對(duì)位置,此處`frm_l`就是在`frm`的左邊,`frm_r`在`frm`的右邊f(xié)rm_l.pack(side='left')frm_r.pack(side='right')###這里的三個(gè)label就是在我們創(chuàng)建的frame上定義的label部件,還是以容器理解,就是容器上貼了標(biāo)簽,來(lái)指明這個(gè)是什么,解釋這個(gè)容器。tk.Label(frm_l, text='on the frm_l1',bg='red').pack()##這個(gè)`label`長(zhǎng)在`frm_l`上,顯示為`on the frm_l1`tk.Label(frm_l, text='on the frm_l2',bg='red').pack()##這個(gè)`label`長(zhǎng)在`frm_l`上,顯示為`on the frm_l2`tk.Label(frm_r, text='on the frm_r1',bg='blue').pack()##這個(gè)`label`長(zhǎng)在`frm_r`上,顯示為`on the frm_r1`##顯示出來(lái)window.mainloop() 演示: messagebox 彈窗其實(shí)這里的 tk.Button(window, text='hit me', command=hit_me).pack() 通過(guò)觸發(fā)功能,調(diào)用 def hit_me():tk.messagebox.showinfo(title='Hi', message='hahahaha') 這里點(diǎn)擊 下面給出幾種形式 tk.messagebox.showinfo(title='',message='')#提示信息對(duì)話窗tk.messagebox.showwarning()#提出警告對(duì)話窗tk.messagebox.showerror()#提出錯(cuò)誤對(duì)話窗tk.messagebox.askquestion()#詢問選擇對(duì)話窗 如果給出如下定義就是打印出我們所選項(xiàng)對(duì)應(yīng)的值 def hit_me():print(tk.messagebox.askquestion(title='Hi', message='hahahaha')) 同樣創(chuàng)建方法都是一樣的形式 print(tk.messagebox.askquestion())#返回yes和noprint(tk.messagebox.askokcancel())#返回true和falseprint(tk.messagebox.askyesno())#返回true和falseprint(tk.messagebox.askretrycancel())#返回true和false 完整代碼: import tkinter as tkimport tkinter.messageboxwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')def hit_me():#tk.messagebox.showinfo(title='',message='')#提示信息對(duì)話窗#tk.messagebox.showwarning()#提出警告對(duì)話窗#tk.messagebox.showerror()#提出錯(cuò)誤對(duì)話窗#tk.messagebox.askquestion(title='Hi', message='hahahaha')#詢問選擇對(duì)話窗print(tk.messagebox.askquestion(title='Hi', message='hahahaha'))#打印出我們所選項(xiàng)對(duì)應(yīng)的值tk.Button(window,text='Hit me',command=hit_me).pack()##顯示出來(lái)window.mainloop() 演示: pack grid place 放置位置pack首先我們先看看我們常用的 tk.Label(window, text='1').pack(side='top')#上tk.Label(window, text='1').pack(side='bottom')#下tk.Label(window, text='1').pack(side='left')#左tk.Label(window, text='1').pack(side='right')#右 grid接下里我們?cè)诳纯?code>grid(), grid 是方格, 所以所有的內(nèi)容會(huì)被放在這些規(guī)律的方格中. for i in range(4):for j in range(3):tk.Label(window, text=1).grid(row=i, column=j, padx=10, pady=10) 以上的代碼就是創(chuàng)建一個(gè)四行三列的表格,其實(shí) place再接下來(lái)就是 tk.Label(window, text=1).place(x=20, y=10, anchor='nw') 完整代碼(只能用一種方式放置): import tkinter as tkwindow = tk.Tk()window.title('my window')##窗口尺寸window.geometry('200x200')#packtk.Label(window, text='1').pack(side='top')#上tk.Label(window, text='1').pack(side='bottom')#下tk.Label(window, text='1').pack(side='left')#左tk.Label(window, text='1').pack(side='right')#右#girdfor i in range(4):for j in range(3):tk.Label(window, text=1).grid(row=i, column=j, padx=10, pady=10)#placetk.Label(window, text=1).place(x=20, y=10, anchor='nw')##顯示出來(lái)window.mainloop() 例子 登錄窗口1這一次效果圖是這樣的: 都是前面熟悉的參數(shù)。為了防止大家忘記,特意加上代碼注釋。 界面創(chuàng)建# welcome imagecanvas = tk.Canvas(window, height=200, width=500)#創(chuàng)建畫布image_file = tk.PhotoImage(file='welcome.gif')#加載圖片文件image = canvas.create_image(0,0, anchor='nw', image=image_file)#將圖片置于畫布上canvas.pack(side='top')#放置畫布(為上端) 這里創(chuàng)建的就是我們效果圖中的 # user informationtk.Label(window, text='User name: ').place(x=50, y= 150)#創(chuàng)建一個(gè)`label`名為`User name: `置于坐標(biāo)(50,150)tk.Label(window, text='Password: ').place(x=50, y= 190)var_usr_name = tk.StringVar()#定義變量var_usr_name.set('example@python.com')#變量賦值'example@python.com'entry_usr_name = tk.Entry(window, textvariable=var_usr_name)#創(chuàng)建一個(gè)`entry`,顯示為變量`var_usr_name`即圖中的`example@python.com`entry_usr_name.place(x=160, y=150)var_usr_pwd = tk.StringVar()entry_usr_pwd = tk.Entry(window, textvariable=var_usr_pwd, show='*')#`show`這個(gè)參數(shù)將輸入的密碼變?yōu)閌***`的形式entry_usr_pwd.place(x=160, y=190) 這里就是創(chuàng)建我們熟悉的登錄界面,就是常見的用戶名,密碼。 # login and sign up buttonbtn_login = tk.Button(window, text='Login', command=usr_login)#定義一個(gè)`button`按鈕,名為`Login`,觸發(fā)命令為`usr_login`btn_login.place(x=170, y=230)btn_sign_up = tk.Button(window, text='Sign up', command=usr_sign_up)btn_sign_up.place(x=270, y=230) 這里定義的就是我們的登錄按鈕。 觸發(fā)功能def usr_login():passdef usr_sign_up():pass 本節(jié)我們只是把登錄的界面做出來(lái),并沒有對(duì)觸發(fā)功能詳細(xì)的去定義。等下節(jié)會(huì)繼續(xù)完善這個(gè)例子。 例子 登錄窗口2這一次效果圖是這樣的: 觸發(fā)的 usr_login 功能##這兩行代碼就是獲取用戶輸入的`usr_name`和`usr_pwd`usr_name = var_usr_name.get()usr_pwd = var_usr_pwd.get()##這里設(shè)置異常捕獲,當(dāng)我們第一次訪問用戶信息文件時(shí)是不存在的,所以這里設(shè)置異常捕獲。##中間的兩行就是我們的匹配,即程序?qū)⑤斎氲男畔⒑臀募械男畔⑵ヅ?。try:with open('usrs_info.pickle', 'rb') as usr_file:usrs_info = pickle.load(usr_file)except FileNotFoundError:##這里就是我們?cè)跊]有讀取到`usr_file`的時(shí)候,程序會(huì)創(chuàng)建一個(gè)`usr_file`這個(gè)文件,并將管理員##的用戶和密碼寫入,即用戶名為`admin`密碼為`admin`。with open('usrs_info.pickle', 'wb') as usr_file:usrs_info = {'admin': 'admin'}pickle.dump(usrs_info, usr_file) 這一部分就是將用戶輸入的用戶名和密碼獲取到,和我們保存在 #如果用戶名和密碼與文件中的匹配成功,則會(huì)登錄成功,并跳出彈窗`how are you?`加上你的用戶名。if usr_name in usrs_info:if usr_pwd == usrs_info[usr_name]:tk.messagebox.showinfo(title='Welcome', message='How are you? ' + usr_name)##如果用戶名匹配成功,而密碼輸入錯(cuò)誤,則會(huì)彈出'Error, your password is wrong, try again.'else:tk.messagebox.showerror(message='Error, your password is wrong, try again.')else: # 如果發(fā)現(xiàn)用戶名不存在is_sign_up = tk.messagebox.askyesno('Welcome','You have not sign up yet. Sign up today?')# 提示需不需要注冊(cè)新用戶if is_sign_up:usr_sign_up() 下面是用戶名存在但是一個(gè)密碼正確, 一個(gè)密碼錯(cuò)誤. 下面是用戶不存在, 提示需不需要注冊(cè)一個(gè)新的用戶. 因?yàn)楸竟?jié)只是定義 本節(jié)主要是詳細(xì)介紹登錄功能,下節(jié)會(huì)繼續(xù)完善注冊(cè)命令。 例子 登錄窗口3這一次效果圖是這樣的: usr_sign_up 界面window_sign_up = tk.Toplevel(window)window_sign_up.geometry('350x200')window_sign_up.title('Sign up window') 這一段首先是創(chuàng)建一個(gè)注冊(cè)的窗口。這里和以往不同的是,多了一個(gè) new_name = tk.StringVar()#將輸入的注冊(cè)名賦值給變量new_name.set('example@python.com')#將最初顯示定為'example@python.com'tk.Label(window_sign_up, text='User name: ').place(x=10, y= 10)#將`User name:`放置在坐標(biāo)(10,10)。entry_new_name = tk.Entry(window_sign_up, textvariable=new_name)#創(chuàng)建一個(gè)注冊(cè)名的`entry`,變量為`new_name`entry_new_name.place(x=150, y=10)#`entry`放置在坐標(biāo)(150,10).new_pwd = tk.StringVar()tk.Label(window_sign_up, text='Password: ').place(x=10, y=50)entry_usr_pwd = tk.Entry(window_sign_up, textvariable=new_pwd, show='*')entry_usr_pwd.place(x=150, y=50)new_pwd_confirm = tk.StringVar()tk.Label(window_sign_up, text='Confirm password: ').place(x=10, y= 90)entry_usr_pwd_confirm = tk.Entry(window_sign_up, textvariable=new_pwd_confirm, show='*')entry_usr_pwd_confirm.place(x=150, y=90)# 下面的 sign_to_Mofan_Python 我們?cè)俸竺娼又f(shuō)btn_comfirm_sign_up = tk.Button(window_sign_up, text='Sign up', command=sign_to_Mofan_Python)btn_comfirm_sign_up.place(x=150, y=130) 相信大家對(duì)這一段代碼已經(jīng)很熟悉了,因?yàn)檫@是大家前面所學(xué)過(guò)的知識(shí)。其實(shí)就是像我們平時(shí)所見的注冊(cè)窗口有一樣,在 sign_to_Mofan_Python() 功能def usr_sign_up():def sign_to_Mofan_Python():##以下三行就是獲取我們注冊(cè)時(shí)所輸入的信息np = new_pwd.get()npf = new_pwd_confirm.get()nn = new_name.get()##這里是打開我們記錄數(shù)據(jù)的文件,將注冊(cè)信息讀出with open('usrs_info.pickle', 'rb') as usr_file:exist_usr_info = pickle.load(usr_file)##這里就是判斷,如果兩次密碼輸入不一致,則提示`'Error', 'Password and confirm password must be the same!'`if np != npf:tk.messagebox.showerror('Error', 'Password and confirm password must be the same!')##如果用戶名已經(jīng)在我們的數(shù)據(jù)文件中,則提示`'Error', 'The user has already signed up!'`elif nn in exist_usr_info:tk.messagebox.showerror('Error', 'The user has already signed up!')##最后如果輸入無(wú)以上錯(cuò)誤,則將注冊(cè)輸入的信息記錄到文件當(dāng)中,并提示注冊(cè)成功`'Welcome', 'You have successfully signed up!'`##然后銷毀窗口。else:exist_usr_info[nn] = npwith open('usrs_info.pickle', 'wb') as usr_file:pickle.dump(exist_usr_info, usr_file)tk.messagebox.showinfo('Welcome', 'You have successfully signed up!')##然后銷毀窗口。window_sign_up.destroy() 這里其實(shí)和前面所講的 注冊(cè)成功就是我們一開始展示的效果圖。 到此,我們的這個(gè)程序已經(jīng)完善。這里給大家奉上我們最后的成果。 完整代碼: import tkinter as tkimport pickleimport tkinter.messageboxwindow = tk.Tk()window.title('Welcome To Myapp!')##窗口尺寸window.geometry('450x300')# welcome imagecanvas = tk.Canvas(window, height=200, width=500)#創(chuàng)建畫布image_file = tk.PhotoImage(file='welcome.gif')#加載圖片文件image = canvas.create_image(0,0, anchor='nw', image=image_file)#將圖片置于畫布上canvas.pack(side='top')#放置畫布(為上端)# user informationtk.Label(window, text='用戶名: ').place(x=50, y= 150)#創(chuàng)建一個(gè)`label`名為`User name: `置于坐標(biāo)(50,150)tk.Label(window, text='密碼: ').place(x=50, y= 190)#用戶名輸入框var_usr_name = tk.StringVar()#定義變量var_usr_name.set('example@python.com')#變量賦值'example@python.com'entry_usr_name = tk.Entry(window, textvariable=var_usr_name)#創(chuàng)建一個(gè)`entry`,顯示為變量`var_usr_name`即圖中的`example@python.com`entry_usr_name.place(x=160, y=150)#密碼輸入框var_usr_pwd = tk.StringVar()entry_usr_pwd = tk.Entry(window, textvariable=var_usr_pwd, show='*')#`show`這個(gè)參數(shù)將輸入的密碼變?yōu)閌***`的形式entry_usr_pwd.place(x=160, y=190)#登錄事件def usr_login():##這兩行代碼就是獲取用戶輸入的`usr_name`和`usr_pwd`usr_name = var_usr_name.get()usr_pwd = var_usr_pwd.get()##這里設(shè)置異常捕獲,當(dāng)我們第一次訪問用戶信息文件時(shí)是不存在的,所以這里設(shè)置異常捕獲。##中間的兩行就是我們的匹配,即程序?qū)⑤斎氲男畔⒑臀募械男畔⑵ヅ?。try:with open('usrs_info.pickle', 'rb') as usr_file:usrs_info = pickle.load(usr_file)except EOFError:##這里就是我們?cè)跊]有讀取到`usr_file`的時(shí)候,程序會(huì)創(chuàng)建一個(gè)`usr_file`這個(gè)文件,并將管理員##的用戶和密碼寫入,即用戶名為`admin`密碼為`admin`。with open('usrs_info.pickle', 'wb') as usr_file:usrs_info = {'admin': 'admin'}pickle.dump(usrs_info, usr_file)#如果用戶名和密碼與文件中的匹配成功,則會(huì)登錄成功,并跳出彈窗`how are you?`加上你的用戶名。if usr_name in usrs_info:if usr_pwd == usrs_info[usr_name]:tk.messagebox.showinfo(title='歡迎', message='你好' + usr_name)##如果用戶名匹配成功,而密碼輸入錯(cuò)誤,則會(huì)彈出'Error, your password is wrong, try again.'else:tk.messagebox.showerror(message='錯(cuò)誤,你的密碼有問題,請(qǐng)重新輸入')else: # 如果發(fā)現(xiàn)用戶名不存在is_sign_up = tk.messagebox.askyesno('Welcome','你還沒有注冊(cè),現(xiàn)在注冊(cè)?')# 提示需不需要注冊(cè)新用戶if is_sign_up:usr_sign_up()#注冊(cè)事件def usr_sign_up():def sign_to_app():##以下三行就是獲取我們注冊(cè)時(shí)所輸入的信息np = new_pwd.get()npf = new_pwd_confirm.get()nn = new_name.get()##這里是打開我們記錄數(shù)據(jù)的文件,將注冊(cè)信息讀出with open('usrs_info.pickle', 'rb') as usr_file:exist_usr_info = pickle.load(usr_file)##這里就是判斷,如果兩次密碼輸入不一致,則提示`'Error', 'Password and confirm password must be the same!'`if np != npf:tk.messagebox.showerror('Error', '兩次密碼輸入不一致哦!')##如果用戶名已經(jīng)在我們的數(shù)據(jù)文件中,則提示`'Error', 'The user has already signed up!'`elif nn in exist_usr_info:tk.messagebox.showerror('Error', '這個(gè)用戶名已經(jīng)注冊(cè)了!')##最后如果輸入無(wú)以上錯(cuò)誤,則將注冊(cè)輸入的信息記錄到文件當(dāng)中,并提示注冊(cè)成功`'Welcome', 'You have successfully signed up!'`##然后銷毀窗口。else:exist_usr_info[nn] = npwith open('usrs_info.pickle', 'wb') as usr_file:pickle.dump(exist_usr_info, usr_file)tk.messagebox.showinfo('Welcome', '你成功注冊(cè)了!')##然后銷毀窗口。window_sign_up.destroy()window_sign_up = tk.Toplevel(window)window_sign_up.geometry('350x200')window_sign_up.title('用戶注冊(cè)')#新用戶名new_name = tk.StringVar()#將輸入的注冊(cè)名賦值給變量new_name.set('example@python.com')#將最初顯示定為'example@python.com'tk.Label(window_sign_up, text='用戶名: ').place(x=10, y= 10)#將`User name:`放置在坐標(biāo)(10,10)。entry_new_name = tk.Entry(window_sign_up, textvariable=new_name)#創(chuàng)建一個(gè)注冊(cè)名的`entry`,變量為`new_name`entry_new_name.place(x=150, y=10)#`entry`放置在坐標(biāo)(150,10).#新密碼new_pwd = tk.StringVar()tk.Label(window_sign_up, text='密碼: ').place(x=10, y=50)entry_usr_pwd = tk.Entry(window_sign_up, textvariable=new_pwd, show='*')entry_usr_pwd.place(x=150, y=50)#防止密碼填錯(cuò)new_pwd_confirm = tk.StringVar()tk.Label(window_sign_up, text='重復(fù)密碼: ').place(x=10, y= 90)entry_usr_pwd_confirm = tk.Entry(window_sign_up, textvariable=new_pwd_confirm, show='*')entry_usr_pwd_confirm.place(x=150, y=90)# 下面的 sign_to_appbtn_comfirm_sign_up = tk.Button(window_sign_up, text='注冊(cè)', command=sign_to_app)btn_comfirm_sign_up.place(x=150, y=130)# 登錄和注冊(cè)按鈕btn_login = tk.Button(window, text='登錄', command=usr_login)#定義一個(gè)`button`按鈕,名為`Login`,觸發(fā)命令為`usr_login`btn_login.place(x=170, y=230)btn_sign_up = tk.Button(window, text='注冊(cè)', command=usr_sign_up)btn_sign_up.place(x=270, y=230)##顯示出來(lái)window.mainloop() 演示: |
|