此篇文章是跟著沫凡小哥的視頻學(xué)習(xí)的,附上學(xué)習(xí)網(wǎng)址:https://morvanzhou./tutorials/python-basic/ 什么是 tkinter 窗口1.1 什么是 TkinterPython自帶的可編輯的GUI界面,是一個(gè)圖像窗口。 Tkinter是使用 python 進(jìn)行窗口視窗設(shè)計(jì)的模塊。簡(jiǎn)單的構(gòu)造,多平臺(tái),多系統(tǒng)的兼容性, 能讓它成為讓你快速入門定制窗口文件的好助手。它在 python 窗口視窗模塊中是一款簡(jiǎn)單型的。所以用來(lái)入門,熟悉窗口視窗的使用,非常有必要。 tkinter 的窗口部件2.1 Label & Button 標(biāo)簽和按鈕窗口主體框架 每一個(gè)tkinter應(yīng)用的主體框架都可以包含下面這部分,定義window窗口和window的一些屬性,然后書寫窗口內(nèi)容,最后執(zhí)行window.mainloop讓窗口活起來(lái)。 import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('300x100')
# 這里是窗口的內(nèi)容
window.mainloop()
首先建立一個(gè)用來(lái)描述的標(biāo)簽tk.Label(注意對(duì)象的首字母一般是大寫),示例代碼如下所示: l = tk.Label(window,
text='OMG! this is TK!', # 標(biāo)簽的文字
bg='green', # 背景顏色
font=('Arial', 12), # 字體和字體大小
width=15, height=2) # 標(biāo)簽長(zhǎng)寬
l.pack() # 固定窗口位置
運(yùn)行結(jié)果如圖所示:
我們也可以通過(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()
接著做按鈕tk.Button: b = tk.Button(window,
text='hit me', # 顯示在按鈕上的文字
width=15, height=2,
command=hit_me) # 點(diǎn)擊按鈕式執(zhí)行的命令
b.pack() # 按鈕位置
hit_me函數(shù)如下: on_hit = False # 默認(rèn)初始狀態(tài)為 False
def hit_me():
global on_hit
if on_hit == False: # 從 False 狀態(tài)變成 True 狀態(tài)
on_hit = True
var.set('you hit me') # 設(shè)置標(biāo)簽的文字為 'you hit me'
else: # 從 True 狀態(tài)變成 False 狀態(tài)
on_hit = False
var.set('') # 設(shè)置文字為空
運(yùn)行結(jié)果如下所示: 沒(méi)有點(diǎn)擊動(dòng)作時(shí):
點(diǎn)擊第一次:
點(diǎn)擊第二次:
完整代碼: import tkinter as tk
window=tk.Tk()
window.title('my window')
window.geometry('300x100')
var=tk.StringVar()
l=tk.Label(window,textvariable=var,bg='green',font=('Arial',12),width=15,
height=2)
l.pack()
on_hit=False
def hit_me():
global on_hit
if on_hit==False:
on_hit=True
var.set('you hit me')
else:
on_hit=False
var.set('')
b=tk.Button(window,text='hit me',width=15,
height=2,command=hit_me)
b.pack()
window.mainloop()
2.2 Entry & Text 輸入, 文本框在定義了窗口的基礎(chǔ)上,首先定義一個(gè)Entry,代碼如下所示: e = tk.Entry(window,show=None)
e.pack()
注意這里的show,可以自定義顯示你想要在Entry中顯示的字符,例如像輸入密碼時(shí),可令show=‘*’ 本節(jié)實(shí)現(xiàn)的例子功能為,如下所示的一個(gè)窗口,從上至下分別為定義的Entry、Button、Button和Text。兩個(gè)Button分別命名為insert point和insert end,獲取Entry中輸入的內(nèi)容并且分別在光標(biāo)位置、末尾插入,內(nèi)容顯示在Text中。
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)
函數(shù)的定義如下所示: def insert_point():
var = e.get()
t.insert('insert',var)
def insert_end():
var = e.get()
t.insert('end',var)
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('300x300')
e = tk.Entry(window,show=None)
e.pack()
def insert_point():
var = e.get()
t.insert('insert',var)
def insert_end():
var = e.get()
t.insert('end',var)
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()
t = tk.Text(window,height=2)
t.pack()
window.mainloop()
運(yùn)行結(jié)果如下所示,首先在Entry中輸入111111,點(diǎn)擊按鈕1,如下:
選擇某一點(diǎn)作為插入位置,再在Entry中輸入2,點(diǎn)擊按鈕1
在Entry中輸入3,點(diǎn)擊按鈕2
此外,insert還能實(shí)現(xiàn)具體位置的內(nèi)容插入,例如將inser_end函數(shù)更改如下: def insert_end():
var = e.get()
t.insert(2.2,var)
則insert_end實(shí)現(xiàn)在Text的2行2列出插入內(nèi)容,運(yùn)行結(jié)果如下所示:
2.3 Listbox 列表部件本節(jié)例子實(shí)現(xiàn)功能為:如下所示,從上到下分別為L(zhǎng)abel、Button和Listbox,Button實(shí)現(xiàn)將Listbox中當(dāng)前光標(biāo)選中的內(nèi)容顯示在Label中。
在定義好窗口的基礎(chǔ)上首先定義Label,設(shè)置底色為黃色,并且要將文本內(nèi)容定義為變量,代碼如下: var1=tk.StringVar()
l=tk.Label(window,bg='yellow',width=4,textvariable=var1)
l.pack()
接著定義Button,命名為‘print selection’,并定義command的函數(shù),如下所示: def print_selection():
value=lb.get(lb.curselection())
var1.set(value)
b1 = tk.Button(window, text='print selection', width=15,
height=2, command=print_selection)
b1.pack()
最后定義Listbox,如下所示實(shí)現(xiàn)了Listbox中內(nèi)容的設(shè)置、插入、刪除等。 var2=tk.StringVar()
var2.set((11,22,33,44))
lb=tk.Listbox(window,listvariable=var2)
list_items=[1,2,3,4]
for item in list_items:
lb.insert('end',item)
lb.insert(1,'first')
lb.insert(2,'second')
lb.delete(2)
lb.pack()
完整代碼如下所示: import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('300x300')
var1=tk.StringVar()
l=tk.Label(window,bg='yellow',width=4,textvariable=var1)
l.pack()
def print_selection():
value=lb.get(lb.curselection())
var1.set(value)
b1 = tk.Button(window, text='print selection', width=15,
height=2, command=print_selection)
b1.pack()
var2=tk.StringVar()
var2.set((11,22,33,44))
lb=tk.Listbox(window,listvariable=var2)
list_items=[1,2,3,4]
for item in list_items:
lb.insert('end',item)
lb.insert(1,'first')
lb.insert(2,'second')
lb.delete(2)
lb.pack()
2.4 Radiobutton 選擇按鈕
如圖所示,Radiobutton即為上圖中可選擇的按鈕,本節(jié)實(shí)現(xiàn)選中不同的Radiobutton時(shí)打印出相應(yīng)的內(nèi)容。 首先定義底色為黃色的Label,代碼見完整代碼。 接著要定義三個(gè)Radiobutton: r1=tk.Radiobutton(window,text='Option A',
variable=var,value='A',
command=print_selection)
r1.pack()
Radiobutton放在window上,命名為‘Option A’,其中var=tk.StringVar(),接著令按鈕的variable等于var,并且賦值為‘A’。 print_selection函數(shù)的定義如下: def print_selection():
l.config(text='you have selected '+var.get())
config能對(duì)所有的參數(shù)進(jìn)行更改,在函數(shù)定義中選擇text屬性進(jìn)行更改。 完整代碼如下: import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('300x300')
var=tk.StringVar()
l=tk.Label(window,bg='yellow',width=20,text='empty')
l.pack()
def print_selection():
l.config(text='you have selected '+var.get())
r1=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()
window.mainloop()
運(yùn)行結(jié)果如下所示,當(dāng)未選中時(shí),Label內(nèi)容顯示為empty,當(dāng)選中某一個(gè)Radiobutton時(shí),則Label中顯示相應(yīng)的內(nèi)容
2.5 Scale 尺度可以被拉動(dòng)的一個(gè)條,Scale返回的是一個(gè)數(shù)字。如下所示,當(dāng)拉動(dòng)時(shí)會(huì)在Label上顯示具體的數(shù)字。
完整代碼如下: import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('300x300')
l=tk.Label(window,bg='yellow',width=20,text='empty')
l.pack()
def print_selection(v):
l.config(text='you have selected '+v)
s=tk.Scale(window,label='try me',from_=5,to=11,orient=tk.HORIZONTAL,
length=200,showvalue=0,tickinterval=3,resolution=0.01,command=print_selection)
s.pack()
window.mainloop()
定義Scale的屬性時(shí),名字為label,from to為取值范圍,from_是為了區(qū)分python中的from,Scale還有橫向和豎向?qū)傩裕⒁鉃閠k.橫向/豎向。length為顯示的長(zhǎng)度,不同于Label中的width,width的單位是字符,和length的單位是像素。showvalue即是否顯示所選中的數(shù)字,取值為0時(shí)不顯示,為1時(shí)顯示。顯示的標(biāo)簽單位長(zhǎng)度為tickinterval,即顯示出的數(shù)字的間隔,取值為3時(shí),即顯示5,8,11。resolution為要保留的小數(shù)個(gè)數(shù)。 在Scale中所定義的command功能是有默認(rèn)傳入值的,該傳入值即為Scale標(biāo)簽當(dāng)前標(biāo)注的值。所以在定義print_selection函數(shù)時(shí)需要定義一個(gè)參數(shù)用于表示該傳入值。 2.6 Checkbutton 勾選項(xiàng)與Radiobutton類似,但是Radiobutton選中一個(gè)后其他默認(rèn)為不選中,但是Checkbutton類似于多選,可以選中多個(gè)。 定義兩個(gè)Checkbutton,如下所示: var1=tk.IntVar()
var2=tk.IntVar()
c1=tk.Checkbutton(window,text='Python',variable=var1,onvalue=1,offvalue=0,
command=print_selection)
c2=tk.Checkbutton(window,text='C++',variable=var2,onvalue=1,offvalue=0,
command=print_selection)
c1.pack()
c2.pack()
首先定義兩個(gè)變量var1和var2,為整型。 兩個(gè)Checkbutton的variable分別等于var1和var,并且選中時(shí)value為1,即onvalue=1,未選中時(shí)offvalue=0. command的print_selection定義如下,根據(jù)var1和var2的值來(lái)進(jìn)行相應(yīng)的操作。 def print_selection():
if(var1.get()==1)&(var2.get()==0):
l.config(text='I love only Python')
elif(var1.get()==0)&(var2.get()==1):
l.config(text='I love only C++')
elif(var1.get()==0)&(var2.get()==0):
l.config(text='I do not love either')
else:
l.config(text='I love both')
完整代碼如下所示: import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('300x300')
l=tk.Label(window,bg='yellow',width=20,text='empty')
l.pack()
def print_selection():
if(var1.get()==1)&(var2.get()==0):
l.config(text='I love only Python')
elif(var1.get()==0)&(var2.get()==1):
l.config(text='I love only C++')
elif(var1.get()==0)&(var2.get()==0):
l.config(text='I do not love either')
else:
l.config(text='I love both')
var1=tk.IntVar()
var2=tk.IntVar()
c1=tk.Checkbutton(window,text='Python',variable=var1,onvalue=1,offvalue=0,
command=print_selection)
c2=tk.Checkbutton(window,text='C++',variable=var2,onvalue=1,offvalue=0,
command=print_selection)
c1.pack()
c2.pack()
window.mainloop()
運(yùn)行結(jié)果如下所示:
單獨(dú)選中Python時(shí):
單獨(dú)選中C++時(shí): 兩個(gè)都選中: 兩個(gè)都不選: 2.7 Canvas 畫布規(guī)定一片區(qū)域,可以放置圖片、圖形等等,并且可以把位置和形狀進(jìn)行改變。 import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('300x300')
canvas=tk.Canvas(window,bg='blue',height=150,width=200)
image_file=tk.PhotoImage(file='3.png')
image=canvas.create_image(10,10,anchor='nw',image=image_file)
x0,y0,x1,y1=90,90,120,120
line=canvas.create_line(x0,y0,x1,y1)
oval=canvas.create_oval(x0,y0,x1,y1,fill='yellow')
arc=canvas.create_arc(x0+30,y0+30,x1+30,y1+30,start=0,extent=180,fill='green')
rect=canvas.create_rectangle(100,30,100+20,30+20)
canvas.pack()
def moveit():
canvas.move(rect,0,2)
b=tk.Button(window,text='move',command=moveit).pack()
window.mainloop()
首先定義一個(gè)Canvas。 放置一張圖片,首先讀取讀片并存入到image_file中,接著Canvas通過(guò)create.image將圖片放置到畫布上。注意10,10為放置的坐標(biāo),anchor意為錨點(diǎn),即錨定的位置,可選擇的屬性如下所示:
nw即為放置在左上角,圖片最左上角的點(diǎn)放置的坐標(biāo)應(yīng)為所定義的10,10. 接著create.line從坐標(biāo)為(90,90)到(120,120)繪制一條直線。 create.oval為繪制圓形,fill填充顏色。 create.arc為繪制扇形,start和extent表示該扇形從0°到180°。 create.rectangle為繪制一個(gè)正方形。 此外,定義了一個(gè)button,該按鈕的作用是每點(diǎn)擊一次,rect對(duì)象,即為所繪制的正方形下移兩格,moveit函數(shù)中0表示x方向的位移為0,2為y方向上的位移變化尺度。結(jié)果如下所示。
單機(jī)move按鈕,正方形的位置發(fā)生變化: 2.8 Menubar 菜單菜單條,如下所示為本節(jié)將要完成的簡(jiǎn)單菜單條。
首先在窗口window上定義一個(gè)Menu menubar=tk.Menu(window)
接著在menubar上創(chuàng)建File選項(xiàng),首先同樣定義一個(gè)Menu,此時(shí)的Menu是放置在menubar上的,并通過(guò)add_cascade(cascade:級(jí)聯(lián))放置在menubar上 filemenu=tk.Menu(menubar,tearoff=0)
menubar.add_cascade(label='File',menu=filemenu)
接著如上圖所示,在File選項(xiàng)中,增加New、Open、Save,分隔線、以及Exit filemenu.add_command(label='New',command=do_job)
filemenu.add_command(label='Open',command=do_job)
filemenu.add_command(label='Save',command=do_job)
filemenu.add_separator()
filemenu.add_command(label='Exit',command=window.quit)
同理,增加Edit選項(xiàng),代碼詳見完整代碼
接著,我們來(lái)創(chuàng)建File中的Submenu,如下圖所示
submenu=tk.Menu(filemenu)
filemenu.add_cascade(label='Import',menu=submenu,underline=0)
submenu.add_command(label='Submenu1',command=do_job)
在代碼中,do_job做了一個(gè)簡(jiǎn)單的顯示功能,如下所示: counter=0
def do_job():
global counter
l.config(text='do '+str(counter))
counter+=1
完整代碼: import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('300x300')
l=tk.Label(window,text='',bg='yellow')
l.pack()
counter=0
def do_job():
global counter
l.config(text='do '+str(counter))
counter+=1
menubar=tk.Menu(window)
filemenu=tk.Menu(menubar,tearoff=0)
menubar.add_cascade(label='File',menu=filemenu)
filemenu.add_command(label='New',command=do_job)
filemenu.add_command(label='Open',command=do_job)
filemenu.add_command(label='Save',command=do_job)
filemenu.add_separator()
filemenu.add_command(label='Exit',command=window.quit)
editmenu=tk.Menu(menubar,tearoff=0)
menubar.add_cascade(label='Edit',menu=editmenu)
editmenu.add_command(label='Cut',command=do_job)
editmenu.add_command(label='Copy',command=do_job)
editmenu.add_command(label='Paste',command=do_job)
submenu=tk.Menu(filemenu)
filemenu.add_cascade(label='Import',menu=submenu,underline=0)
submenu.add_command(label='Submenu1',command=do_job)
window.config(menu=menubar)
window.mainloop()
2.9 Frame 框架底層框架,可以在上面放各種小部件
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('300x300')
tk.Label(window,text='on the window').pack()
frm=tk.Frame(window)
frm.pack()
frm_l=tk.Frame(frm,)
frm_r=tk.Frame(frm)
frm_l.pack(side='left')
frm_r.pack(side='right')
tk.Label(frm_l,text='on the frm_l1').pack()
tk.Label(frm_l,text='on the frm_l2').pack()
tk.Label(frm_r,text='on the frm_r1').pack()
window.mainloop()
首先定義一個(gè)主Frame,放在window上 接著定義了第二層的兩個(gè)Frame,分別放在主Frame的左右側(cè) 在左邊的Frame上放置了兩個(gè)標(biāo)簽,右邊放了一個(gè)標(biāo)簽 2.10 messagebox 彈窗在window的基礎(chǔ)上定義一個(gè)Button tk.Button(window, text='hit me', command=hit_me).pack()
如圖所示:
接著定義一個(gè)彈窗,在運(yùn)行時(shí)出現(xiàn)錯(cuò)誤 AttributeError: module 'tkinter' has no attribute 'messagebox' 試著加入import則可運(yùn)行成功 from tkinter import messagebox
messagebox有多種功能,接下來(lái)將分別細(xì)述 (1)showinfo tk.messagebox.showinfo(title='Hi', message='hahahaha')
(2)showwarning tk.messagebox.showwarning(title='Hi', message='nononono')
(3)showerror tk.messagebox.showerror(title='Hi', message='No!! never')
(4)askquestion返回是字符串,即返回的是‘yes’或者‘no’,可通過(guò)print打印出來(lái)以更好的理解 print(tk.messagebox.askquestion(title='Hi', message='hahahaha')) # return 'yes' , 'no'
選擇是打印出的值為‘yes’
根據(jù)return的值可進(jìn)一步選擇需要的操作 if return==‘yes’ (5)askyesno 返回的是True或者False print(tk.messagebox.askyesno(title='Hi', message='hahahaha')) # return True, False
同樣可根據(jù)返回的值來(lái)進(jìn)一步操作。 (6)asktrycancel print(tk.messagebox.asktrycancel(title='Hi', message='hahahaha')) # return True, False
但是不知道為什么運(yùn)行時(shí)出現(xiàn)錯(cuò)誤:AttributeError: module 'tkinter.messagebox' has no attribute 'asktrycancel' (7)askokcancel print(tk.messagebox.askokcancel(title='Hi', message='hahahaha')) # return True, False
(8)askyesnocancel print(tk.messagebox.askyesnocancel(title="Hi", message="haha")) # return, True, False, None
完整代碼: import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('200x200')
def hit_me():
#tk.messagebox.showinfo(title='Hi', message='hahahaha')
#tk.messagebox.showwarning(title='Hi', message='nononono')
#tk.messagebox.showerror(title='Hi', message='No!! never')
#print(tk.messagebox.askquestion(title='Hi', message='hahahaha')) # return 'yes' , 'no'
#print(tk.messagebox.askyesno(title='Hi', message='hahahaha')) # return True, False
#print(tk.messagebox.asktrycancel(title='Hi', message='hahahaha')) # return True, False
#print(tk.messagebox.askokcancel(title='Hi', message='hahahaha')) # return True, False
print(tk.messagebox.askyesnocancel(title="Hi", message="haha")) # return, True, False, None
tk.Button(window, text='hit me', command=hit_me).pack()
window.mainloop()
2.11 pack grid place 放置位置(1)pack side屬性來(lái)決定所放置的位置,共有top、bottom、left、right tk.Label(window,text='1').pack(side='top')
(2)grid 按照格點(diǎn)(方格的形式來(lái)放置) for i in range(4):
for j in range(3):
tk.Label(window,text=1).grid(row=i,column=j,padx=10,pady=10)
無(wú)padx和pady時(shí):
其中padx、pady用于填充顯示,padx和pady用于設(shè)置框架的外部填充顯示,ipadx和ipady用于設(shè)置框架的內(nèi)部顯示。
(3)place 能精確放置到某一坐標(biāo)處 tk.Label(window,text=1).place(x=20,y=10,anchor='nw')
登錄窗口例子3.1 例子1 登錄窗口綜合前面所學(xué)習(xí)的內(nèi)容,設(shè)計(jì)如下窗口
代碼如下所示: import tkinter as tk
window = tk.Tk()
window.title('Welcome to Mofan Python')
window.geometry('450x300')
# welcome image
canvas = tk.Canvas(window, height=200, width=500)
image_file = tk.PhotoImage(file='welcome.gif')
image = canvas.create_image(0,0, anchor='nw', image=image_file)
canvas.pack(side='top')
# user information
tk.Label(window, text='User name: ').place(x=50, y= 150)
tk.Label(window, text='Password: ').place(x=50, y= 190)
var_usr_name = tk.StringVar()
var_usr_name.set('example@python.com')
entry_usr_name = tk.Entry(window, textvariable=var_usr_name)
entry_usr_name.place(x=160, y=150)
var_usr_pwd = tk.StringVar()
entry_usr_pwd = tk.Entry(window, textvariable=var_usr_pwd, show='*')
entry_usr_pwd.place(x=160, y=190)
def usr_login():
pass
def usr_sign_up():
pass
# login and sign up button
btn_login = tk.Button(window, text='Login', command=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)
window.mainloop()
3.2 例子1 登錄窗口本節(jié)添加了Login的功能,代碼如下: def usr_login():
usr_name = var_usr_name.get()
usr_pwd = var_usr_pwd.get()
try:
with open('usrs_info.pickle', 'rb') as usr_file:
usrs_info = pickle.load(usr_file)
except FileNotFoundError:
with open('usrs_info.pickle', 'wb') as usr_file:
usrs_info = {'admin': 'admin'}
pickle.dump(usrs_info, usr_file)
if usr_name in usrs_info:
if usr_pwd == usrs_info[usr_name]:
tk.messagebox.showinfo(title='Welcome', message='How are you? ' + usr_name)
else:
tk.messagebox.showerror(message='Error, your password is wrong, try again.')
else:
is_sign_up = tk.messagebox.askyesno('Welcome',
'You have not sign up yet. Sign up today?')
if is_sign_up:
usr_sign_up()
首先以讀二進(jìn)制的方式打開并下載存儲(chǔ)用戶信息的文件,如果文件不存在,則建立該文件,并且加入了用戶名為admin、密碼為admin的用戶。 如果用戶名在用戶信息文件中存在,密碼輸入正確時(shí),會(huì)彈出歡迎窗口,否則則顯示密碼錯(cuò)誤。 如果用戶不存在,則彈出窗口詢問(wèn)是否要進(jìn)行注冊(cè),并通過(guò)返回的True或是False的值進(jìn)行注冊(cè)操作。 運(yùn)行結(jié)果如下所示:
正確輸入密碼時(shí): 用戶不存在時(shí): 3.3 例子1 登錄窗口注冊(cè)時(shí)將會(huì)彈出新窗口,如下所示:
首先定義一個(gè)新窗口 window_sign_up=tk.Toplevel(window)
window_sign_up.geometry('350x200')
window_sign_up.title('Sign up window')
定義User name、Password和Confirm password,以及三個(gè)Entry和一個(gè)Button new_name = tk.StringVar()
new_name.set('example@python.com')
tk.Label(window_sign_up, text='User name: ').place(x=10, y= 10)
entry_new_name = tk.Entry(window_sign_up, textvariable=new_name)
entry_new_name.place(x=150, y=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)
btn_confirm_sign_up = tk.Button(window_sign_up, text='Sign up', command=sign_to_Mofan_Python)
btn_confirm_sign_up.place(x=150, y=130)
接著定義函數(shù)sign_to_Mofan_Python def sign_to_Mofan_Python():
np = new_pwd.get()
npf = new_pwd_confirm.get()
nn = new_name.get()
with open('usrs_info.pickle', 'rb') as usr_file:
exist_usr_info = pickle.load(usr_file)
if np != npf:
tk.messagebox.showerror('Error', 'Password and confirm password must be the same!')
elif nn in exist_usr_info:
tk.messagebox.showerror('Error', 'The user has already signed up!')
else:
exist_usr_info[nn] = np
with 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()
打開讀取文件usrs_info,首先判斷密碼是否相等,如果不相等,則彈出窗口提示密碼輸入不一致 如果用戶名存在,則彈出窗口提示用戶名已經(jīng)注冊(cè) 注冊(cè)合格的話,則將信息存放,pickle里面存放的是一個(gè)字典,exist_usr_info[nn] = np該句即為username:password,通過(guò)dump將新的注冊(cè)信息傳入到用戶信息文件中。并彈出窗口提示注冊(cè)成功 最后通過(guò)destory關(guān)閉注冊(cè)窗口 完整代碼如下: def usr_sign_up():
def sign_to_Mofan_Python():
np = new_pwd.get()
npf = new_pwd_confirm.get()
nn = new_name.get()
with open('usrs_info.pickle', 'rb') as usr_file:
exist_usr_info = pickle.load(usr_file)
if np != npf:
tk.messagebox.showerror('Error', 'Password and confirm password must be the same!')
elif nn in exist_usr_info:
tk.messagebox.showerror('Error', 'The user has already signed up!')
else:
exist_usr_info[nn] = np
with 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()
window_sign_up=tk.Toplevel(window)
window_sign_up.geometry('350x200')
window_sign_up.title('Sign up window')
new_name = tk.StringVar()
new_name.set('example@python.com')
tk.Label(window_sign_up, text='User name: ').place(x=10, y=10)
entry_new_name = tk.Entry(window_sign_up, textvariable=new_name)
entry_new_name.place(x=150, y=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)
btn_confirm_sign_up = tk.Button(window_sign_up, text='Sign up', command=sign_to_Mofan_Python)
btn_confirm_sign_up.place(x=150, y=130)
運(yùn)行結(jié)果如下所示: 當(dāng)用戶名已存在時(shí):
當(dāng)密碼輸入不一致時(shí):
當(dāng)注冊(cè)成功時(shí): 點(diǎn)擊確定后注冊(cè)窗口關(guān)閉 用注冊(cè)的用戶進(jìn)行登錄,彈出窗口:
|
|
來(lái)自: 昵稱54060840 > 《待分類》