import subprocess:导入subprocess模块,用于创建新的进程,可以用来运行其他程序。
import tkinter as tk:导入Tkinter模块,用于创建GUI,并将其重命名为tk。
import pickle:导入pickle模块,用于将Python对象序列化和反序列化,这里用于存储和读取用户信息。
from tkinter import messagebox:从Tkinter模块中导入messagebox,用于显示消息框。
import subprocess
import tkinter as tk
import pickle
from tkinter import messagebox
这四行代码创建了一个新的Tkinter窗口,设置了窗口的标题为"Welcome",并设置了窗口的大小为450x300像素。
window=tk.Tk()
window.title('Welcome')
window.geometry('450x300')
这段代码在窗口中创建了一个画布(canvas),并在画布上显示了一个名为'welcome.gif'的图片。
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的StringVar对象,用于存储用户名。然后创建了一个文本输入框(Entry),并将StringVar对象绑定到这个输入框。
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的StringVar对象,用于存储密码。然后创建了一个文本输入框(Entry),并将StringVar对象绑定到这个输入框。这个输入框使用了show='*'参数,这意味着输入的文字将以星号(*)显示,以隐藏密码。
var_usr_pwd=tk.StringVar()
entry_usr_pwd=tk.Entry(window,textvariable=var_usr_pwd,show='*')
entry_usr_pwd.place(x=160,y=190)
这段代码创建了两个按钮,一个用于登录(usr_login),另一个用于注册(usr_sign_up)。这两个按钮都没有实现具体的函数逻辑,需要用户自己添加。
#login and sign up button
def usr_login():
pass
def usr_sign_up():
pass
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)
这段代码是usr_login函数的实现。它首先获取用户名和密码,然后尝试从文件usrs info.pickle中加载用户信息。如果文件不存在,则创建一个新的文件,并初始化用户信息为{'admin': 'admin'}。然后,它检查用户名是否在用户信息中,如果是,则检查密码是否正确。如果用户名和密码都正确,则弹出一个欢迎信息。如果密码错误,则弹出一个错误信息。如果用户名不在用户信息中,则弹出一个提示用户注册的对话框。
def usr_login():
usr_name=var_usr_name.get()
usr_pwd=var_usr_pwd.get()
print(usr_name)
try:
with open('usrs_info.pickle','rb')as usr_file:
print('1')
usrs_info=pickle.load(usr_file)
print(usrs_info)
except FileNotFoundError:
with open('usrs_info.pickle','wb')as usr_file:
print('2')
usrs_info={'admin':'admin'}
pickle.dump(usrs_info,usr_file)#序列化
print('OK')
print('usr_name:',usr_name)
if usr_name in usrs_info:
print('3')
if usr_pwd ==usrs_info[usr_name]:
tk.messagebox.showinfo(title='Welcome',message='How are your?'+ usr_name)
window.destroy()
subprocess.Popen(["python","demo01 zi.py"])
else:
tk.messagebox.showerror(message='Error,your password is wrong,try again.')
else:
print('4')
is_sign_up=tk.messagebox.askyesno(title='Welcome',message='You have not sign up yet.Sign up today?')
if is_sign_up:
usr_sign_up()
弹出一个新的用户注册对话框
def usr_sign_up():
print('开始注册')
def sign_up():
#获取输入
nn = new_name.get()
np = new_pwd.get()
npf = new_pwd_confirm.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:
print('已经注册过了')
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')
tk.Label(window_sign_up, text='User name: ').place(x=10, y= 10)#将`User name:`放置在坐标(10,10)。
tk.Label(window_sign_up, text='Password: ').place(x=10, y=50)
tk.Label(window_sign_up, text='Confirm password: ').place(x=10, y= 90)
#用户名输入框
new_name = tk.StringVar()#将输入的注册名赋值给变量
new_name.set(var_usr_name.get())#将最初显示定为'example@python.com'
entry_new_name = tk.Entry(window_sign_up, textvariable=new_name)#创建一个注册名的`entry`,变量为`new_name`
entry_new_name.place(x=150, y=10)#`entry`放置在坐标(150,10).
#密码输入框
new_pwd = tk.StringVar()
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()
entry_usr_pwd_confirm = tk.Entry(window_sign_up, textvariable=new_pwd_confirm, show='*')
entry_usr_pwd_confirm.place(x=150, y=90)
#注册按钮
btn_comfirm_sign_up = tk.Button(window_sign_up, text='Sign up', command=sign_up)
btn_comfirm_sign_up.place(x=150, y=130)
#登录按钮
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():启动Tkinter事件循环,让窗口等待用户操作。
window.mainloop()