码迷,mamicode.com
首页 > 编程语言 > 详细

tkinter+pickle+python的一个登录界面设计

时间:2020-01-16 23:32:43      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:des   输入   pre   ready   登陆   pen   load   class   hot   

1.代码:

技术图片
#导出模块
import tkinter as tk
from tkinter import messagebox
import pickle

#定义登录的窗口、标题、大小和位置
window = tk.Tk()
window.title(Welcome to Python)
window.geometry(800x500+800+200) 
#window.configure(bg=‘pink‘) #设置主窗口的configure的一个参数:bg(背景颜色)
window.config(bg=pink) #等同上面的configure=config

# 定义登录窗口的一块画布canvas,放置一张图片,welcome image
canvas = tk.Canvas(window, bg=black,height=140, width=550)
image_file = tk.PhotoImage(file=welcome1.gif) #默认目录,本机是home/xgj/
image = canvas.create_image(100,0, anchor=nw, image=image_file) #坐标x=0,y=0,錨定在西北角,就是左上角
canvas.pack(side=top) #pack为顶格布局

# 登录窗口的界面:user information
#2个标签label
tk.Label(window, bg=pink,font=10,text=User name: ).place(x=50, y= 150)
tk.Label(window, bg=pink,font=10,text=Password: ).place(x=50, y= 250)

#定义输入框和取值函数
var_usr_name = tk.StringVar()
var_usr_name.set(example@qq.com) #初始化信息
#对应的2个输入框entry
entry_usr_name = tk.Entry(window, font=10,textvariable=var_usr_name)
entry_usr_name.place(x=260, y=150)

var_usr_pwd = tk.StringVar() #初始化为空
entry_usr_pwd = tk.Entry(window,font=10, textvariable=var_usr_pwd, show=*) #密码显示*,为不可见
entry_usr_pwd.place(x=260, y=250)

#登陆后的主窗口
def main():
    window = tk.Tk()
    window.title(xgj main GUI)
    window.geometry(1050x800+800+0)
    #---如果要设计main界面和窗口功能可以继续定义---
    #---目前只是一个登录和注册界面的---
    #---如果设计,可以继续添加---

#定义登录函数
def usr_login(): #初次登录,如果先点击这个,就不会报错,没有usrs_info.pickle这个文件
    #获取值的赋值
    usr_name = var_usr_name.get()
    usr_pwd = var_usr_pwd.get()
    try:  #下面使用pickle模块进行数据的管理和使用
          #如果没有这个文件usrs_info.pickle,则会rb创建一个新的;如果有,则打开这个文件
          #在登录窗口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)
            window.destroy() #登录界面的窗口销毁、退出
            main() #进入主界面
        else:
            tk.messagebox.showerror(message=Error, your password is wrong, try again.)
    else:
        is_sign_up = tk.messagebox.askyesno(Welcome,
                               You have not signed up yet. Sign up today?)
        if is_sign_up: #如果是按钮yes
            usr_sign_up() #进入usr_sign_up(注册窗口)

#定义注册界面register
def usr_sign_up(): #小bug,初次登录或者注册,如果先点击这个就会报错,没有usrs_info.pickle文件
    def sign_to_Python():
        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)
        
        #bug,在注册界面,由于默认usr,密码和确认密码是空格,也能注册,这是一个bug
        if np==npf==‘‘: #增加一个判断,不能是空格
            tk.messagebox.showerror(Error, Password and confirm password must not be empty!) 
        elif 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) #与下面的设置一样,但有一个区别,就是set()初始值可以有
    #window_sign_up=tk.Tk() #与上面的设置一样,但是new_name.set(‘example@python.com‘) #初始值传不过去
    window_sign_up.title(Sign up window)
    window_sign_up.geometry(800x500+800+200)

    new_name = tk.StringVar()
    #如果采取tk.Toplevel(window),则下面的初始值可以传过去,但是tk.Tk() 时,下面的初始值竟然传不过去?
    new_name.set(example@qq.com) #初始值
    #定义label标签和对应的entry---user name
    tk.Label(window_sign_up,font=10, text=User       name           : ).place(x=10, y= 10)
    entry_new_name = tk.Entry(window_sign_up,font=10,textvariable=new_name)
    entry_new_name.place(x=300, y=10)
    #定义label标签和对应的entry---Password 
    new_pwd = tk.StringVar()
    tk.Label(window_sign_up, font=10,text=Password                   : ).place(x=10, y=60)
    entry_usr_pwd = tk.Entry(window_sign_up,font=10, textvariable=new_pwd, show=*)
    entry_usr_pwd.place(x=300, y=60)
    #定义label标签和对应的entry---Confirm password
    new_pwd_confirm = tk.StringVar()
    tk.Label(window_sign_up, font=10,text=Confirm password: ).place(x=10, y= 110)
    entry_usr_pwd_confirm = tk.Entry(window_sign_up, font=10,textvariable=new_pwd_confirm, show=*)
    entry_usr_pwd_confirm.place(x=300, y=110)
    #定义按钮---Sign up---就是注册按钮
    
    btn_comfirm_sign_up = tk.Button(window_sign_up,font=10, text=Sign up, command=sign_to_Python)
    btn_comfirm_sign_up.place(x=300, y=170)

# 登录界面的2个按钮---login and sign up button
btn_login = tk.Button(window,bg=yellow, font=10,text=Login, command=usr_login)
btn_login.place(x=260, y=350)
btn_sign_up = tk.Button(window, bg=yellow,font=10,text=Sign up, command=usr_sign_up)
btn_sign_up.place(x=500, y=350)

window.mainloop()
View Code

 

2. 存在的问题bug:

2.1 就是如下图所示,第1次打开登录界面时,因为系统还没有这个文件:usrs_info.pickle

2.2 所以,如果直接进入sign up(第2个按钮,右下的那个按钮),弹出一个sign up界面,是不能注册资料,要报错的

2.3 第1次,需要 login按钮(第1个按钮,坐下的那个按钮)

图1

技术图片

3.图

技术图片

tkinter+pickle+python的一个登录界面设计

标签:des   输入   pre   ready   登陆   pen   load   class   hot   

原文地址:https://www.cnblogs.com/ysysbky/p/12203530.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!