Python内置的GUI编程工具tkinter小巧灵活。本文以密码编码器为例。所有注册用户都将在一个持续的过程中登录/注册。如果成功,将显示欢迎消息。如果密码不正确或密码错误,会有相应的警告。如果账号不存在,会提示。注册和回调子页面注册,需要密码确认,已经注册的用户会提示构造两个window窗口,一个负责介绍主界面背景图,一个负责注册账号密码,ui以tk为后缀名。event是tk的事件回调,store使用pickle字典序列化存储类,usrs.pickle是持久化存储入口│event.py│login_tk.py│sign_up_tk.py│store.py│usrs.pickle│├─.vscode│settings.json│├─img│coffee.png│java_classLoader.gif│web_spring.png│yms3mhzsf22.jpg│└─__pycache__event.cpython-37.pyclogin.cpython-37.pycsign_up_tk.cpython-37。pyc商店。cpython-37.pyc入口UIlogin_tk.pyfromtkinterimport*fromtkinterimportttkfromeventimportloginfromsign_up_tkimportusr_sign_up"""Defineinterface"""#1.Rootinstanceroot=Tk()root.title("WellcometoLogin")root.geometry('400x350')#2.加载图像canvas=Canvas(root,width=400,height=150,bg='green')image_file=PhotoImage(file='img/coffee.png')image=canvas.create_image(200,0,anchor='n',image=image_file)#指定绘制方向canvas.pack(side='top')#文字引用ttk.Label(root,text='Welcometothecipher',font=('Arial',16)).pack()#3.用户静态文本ttk.Label(root,text='User:',font=('Arial',14)).place(x=50,y=185)ttk.Label(root,text='Password:',font=('Arial',14)).place(x=50,y=215)#4.账户输入变量uname=StringVar()uname.set('example@pardon110.com')ttk.Entry(root,textvariable=uname,font=('Arial',14)).place(x=120,y=185)#5.密码输入pwd=StringVar()#6.文本变量绑定参数ttk.Entry(root,textvariable=pwd,font=('Arial',14),show='*')。place(x=120,y=215)#7.事件回调使用变量ttk.Button(root,text='login',command=lambda:login(uname.get(),pwd.get())).place(x=120,y=270)#8.注册加子页面ttk.Button(root,text='register',command=lambda:usr_sign_up(root)).place(x=250,y=270)#6.事件循环root.mainloop()registerUIsign_up_tk.pyfromtkinterimport*fromtkinterimportttkfromeventimportsign_up_webdefusr_sign_up(root):#在主窗口上定义副窗口window_sign_up=Toplevel(root)window_sign_up.geometry('300x200')window_sign_up.title('register')#用户名uname=StringVar()uname.set('example@pardon110.com')ttk.Label(window_sign_up,text="用户名:").place(x=10,y=10)ttk.Entry(window_sign_up,textvariable=uname).place(x=130,y=10)#passwordnew_pwd=StringVar()ttk.Label(window_sign_up,text='password:').place(x=10,y=50)ttk.Entry(window_sign_up,textvariable=new_pwd,show='*').place(x=130,y=50)#密码确认new_pwd_confirm=StringVar()ttk.Label(window_sign_up,text='Repeatpassword:').place(x=10,y=90)ttk.Entry(window_sign_up,textvariable=new_pwd_confirm,show='*').place(x=130,y=90)#确认注册btn_comfirm_sign_up=ttk.Button(window_sign_up,text='register',command=lambda:sign_up_web(new_pwd.get(),new_pwd_confirm.get(),uname.get(),window_sign_up)).place(x=180,y=120)事件回调event.pyfromtkinterimport*fromtkinterimportttkimporttkinter.messageboxasmsgboxfromstoreimportStore"""回调事件模块"""deflogin(uname,pwd):usrs_info=Store()._usrsifunameinusrs_info:ifpwd==usrs_info[uname]:msgbox.showinfo(title="Welcome",message='Areyouokay?'+uname)else:msgbox.showerror(message='错误!密码不正确,请重试。')else:msgbox.askyesno('欢迎'+uname,'您还没有注册,请先注册')defsign_up_web(pwd,confirm,uname,window_sign_up):db=Store()ifpwd!=confirm:print(pwd,confirm)msg??box.showerror('Error','两次输入的密码不一致!')elifunameindb._usrs:msgbox.showerror('Warning','该用户已经注册!')else:#注册新用户db.add(uname,pwd).save()msg??box.showinfo('欢迎'+uname,'您注册成功!')#销毁注册窗口window_sign_up.destroy()storageclassimportpickle"""dataStorageModule"""classStore:def__init__(self,db="usrs.pickle"):self._db=dbself._usrs=self._read()def_read(self):try:#反序列化对象open(self._db,'rb')asf:self._usrs=pickle.load(f)除了文件NotFoundError:#序列化对象withopen(self._db,'wb')asf:#默认内置管理员self._usrs={'admin':'123456'}#持久写入文件pickle.dump(self._usrs,f)returnself._usrs#persistentdefsave(self):withopen(self._db,'wb')asf:pickle.dump(self._usrs,f)f.close()#添加新用户defadd(self,uname,pwd):self._usrs[uname]=pwdreturnselfdefshow(self):print(self._usrs)db=Store()#db.add("zhansang","654321")#db.save()db.show()其他tk图片类只支持gif、png等有限图片,布局管理支持相对定位(pack自动计算)、坐标系place、gridgridsystem
