zoukankan      html  css  js  c++  java
  • Tkinter(十二):用Tkinter实现一个登陆窗口

     本节是Tkinter系列的最后一节,是一个综合性的小实践项目。

    感谢莫烦大佬的教程,跟着他的教程一节一节的看过来的。大家可以百度能搜索到。

    这个小项目是个典型的登录窗口,其中包含了前面章节的很多知识点

    比如canvas,Label,Entry等等,效果如图,点击Login和Sign up都会有对应的响应函数,大家可以试一试

    代码如下,其中需要注意的几点

    1.引入了pickle库,这个是python的自带库,不需要另外的安装,可以用来存储数据

    2.点击Sign up,主窗口弹出了次级窗口 window_sign_up = tk.Toplevel(window)

    import tkinter as tk
    import pickle
    import tkinter.messagebox
    
    # 定义窗口
    window = tk.Tk()
    window.title('Welcome to my Tkinter Test')  # 窗口title
    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 infomation - Label
    tk.Label(window, text='User name').place(x=50, y=150)
    tk.Label(window, text='Password').place(x=50, y=190)
    
    # user infomation - Entry
    var_user_name = tk.StringVar()
    var_user_name.set('lalal@qq.com')
    var_user_pwd = tk.StringVar()
    
    entry_user_name = tk.Entry(window, textvariable=var_user_name)
    entry_user_name.place(x=160, y=150)
    entry_user_pwd = tk.Entry(window, textvariable=var_user_pwd, show='*')
    entry_user_pwd.place(x=160, y=190)
    
    # Login and singn up button
    '''
    Login部分
    '''
    
    
    def user_login():
        user_name = entry_user_name.get()
        user_pwd = entry_user_pwd.get()
    
        # 第一次访问时,文件肯定是不存在的,所以设置异常捕获
        # 没有读取到文件时,创建一个文件,并将管理员用户密码写入
        try:
            with open('users_info.pickle', 'rb') as user_file:
                user_info = pickle.load(user_file)
        except FileNotFoundError:
            with open('users_info.pickle', 'wb') as user_file:
                user_info = {'admin': 'admin'}
                pickle.dump(user_info, user_file)
    
        # 判断user_name是否在user_info里面
        if user_name in user_info:
            # 如果在,则判断密码是否正确,正确则进入系统,不正确则提示密码错误
            if user_pwd == user_info[user_name]:
                tk.messagebox.showinfo(title='welcome', message='How are you? ' + user_name)
            else:
                tk.messagebox.showerror(message="Error,your password is wrong,try again")
        # user_name不在user_info里面,则提示注册
        else:
            is_sign_up = tk.messagebox.askyesno(title='Welcome', message='You have not sign up yet. Sign up today?')
            if is_sign_up == True:
                user_sign_up()
            else:
                tk.messagebox.showinfo(title='Bye', message='Bye~~')
    
    
    '''
    sign up部分
    '''
    
    
    def user_sign_up():
        def sign_to_system():
            # 从signup窗口取出值
            np = new_pwd.get()
            npf = new_pwd_confirm.get()
            nn = new_name.get()
    
            with open('users_info.pickle', 'rb') as user_file:
                exist_user_info = pickle.load(user_file)
    
            # 判断两次密码是否一致
            if np != npf:
                tk.messagebox.showerror(title='Eorror', message='两次密码输入不一致')
            # 判断用户名是否存在
            elif nn in exist_user_info:
                tk.messagebox.showerror(title='Error', message='用户名已存在')
            # 将用户名密码写入文件,并存在user_file中
            else:
                exist_user_info[nn] = np
                with open('users_info.pickle', 'wb') as user_file:
                    pickle.dump(exist_user_info, user_file)
                tk.messagebox.showinfo(title='Congratulations', message='注册成功')
            # 销毁窗口
            window_sign_up.destroy()
    
        # 在主窗口下定义次级窗口
        window_sign_up = tk.Toplevel(window)
        window_sign_up.geometry('350x200')
        window_sign_up.title('Sign up window')
        # 定义Label
        tk.Label(window_sign_up, text='User name:').place(x=10, y=10)
        # 定义entry - name
        new_name = tk.StringVar()
        new_name.set('hahah@qq.com')
        entry_new_name = tk.Entry(window_sign_up, textvariable=new_name)
        entry_new_name.place(x=150, y=10)
        # 定于 entry - pwd
        new_pwd = tk.StringVar()
        tk.Label(window_sign_up, text='Password').place(x=10, y=50)
        entry_new_pwd = tk.Entry(window_sign_up, textvariable=new_pwd, show='*')
        entry_new_pwd.place(x=150, y=50)
        # 定于 entry - pwd - confirm
        new_pwd_confirm = tk.StringVar()
        tk.Label(window_sign_up, text='Confirm Password').place(x=10, y=90)
        new_pwd_confirm = tk.Entry(window_sign_up, textvariable=new_pwd_confirm, show='*')
        new_pwd_confirm.place(x=150, y=90)
    
        # 定义Button
        btn_confirm_sign_up = tk.Button(window_sign_up, text='Sign up', command=sign_to_system)
        btn_confirm_sign_up.place(x=150, y=130)
    
    
    btn_login = tk.Button(window, text='Login', command=user_login)
    btn_login.place(x=170, y=230)
    btn_sign_up = tk.Button(window, text='Sign up', command=user_sign_up)
    btn_sign_up.place(x=270, y=230)
    
    window.mainloop()
  • 相关阅读:
    plsql-游标
    pl/sql--基本的语法及操作
    Oracle数据库管理
    JMS-ActiveMq-订阅发布模式
    JMS-ActiveMq-点对点模式
    JMS-ActiveMq
    poi之excel的模板导入(随后分享)
    数据流写出util
    dba_tables、all_tables、user_tables
    oracle的一些操作
  • 原文地址:https://www.cnblogs.com/ronyjay/p/13730991.html
Copyright © 2011-2022 走看看