0
点赞
收藏
分享

微信扫一扫

3.12 创建登录窗口

本章将会创建一个如下图样式的登录界面:

下面让我们一步步实现它!

1 构建登录窗口的布局

首先,设计整个窗口的布局:

from tkinter import ttk, Tk
from tkinter import StringVar, BooleanVar
from tkinter import Canvas
from PIL import ImageTk, Image


class HelloWindow(Tk):
    def __init__(self, hello_image='images/leimu.jpg'):
        super().__init__()
        self.title('欢迎进入计算机视觉的世界')
        self.geometry('400x270')  # 默认窗口大小
        self.maxsize(400, 300)  # 限制窗口大小
        self._hello_image(hello_image)
        self._set_variable()
        self.create_widgets()
        self._layout()
        # 设定鼠标光标进入密码的输入框,显示密码,离开之后显示为 '*'
        self.entry_usr_pwd.bind(
            '<Enter>', lambda e: self.entry_usr_pwd.config(show=''))
        self.entry_usr_pwd.bind(
            '<Leave>', lambda e: self.entry_usr_pwd.config(show='*'))

    def _hello_image(self, hello_image):
        '''欢迎界面的图片'''
        self.I = Image.open(hello_image).resize((380, 100))
        self.canvas = Canvas(height=100, width=380)
        self.image_file = ImageTk.PhotoImage(self.I)
        self.canvas.create_image(20, 0, anchor='nw', image=self.image_file)

    def _set_variable(self):
        '''设置变量'''
        self.var_usr_name = StringVar()  # 用户名变量
        self.var_usr_pwd = StringVar()  # 密码变量

    def create_widgets(self):
        '''创建主要的小部件'''
        self.frame_usr = ttk.Frame()  # 用户信息框架
        self.frame_act = ttk.Frame()  # 用户行为框架
        self.label_usr_name = ttk.Label(self.frame_usr, text='用户名: ')
        self.entry_usr_name = ttk.Entry(
            self.frame_usr, textvariable=self.var_usr_name, width=25)
        self.label_usr_pwd = ttk.Label(self.frame_usr, text='密码: ')
        self.entry_usr_pwd = ttk.Entry(
            self.frame_usr, textvariable=self.var_usr_pwd, show='*', width=25)
        self.button_login = ttk.Button(
            self.frame_act, text='登录', command=self.usr_login)
        self.button_login = ttk.Button(
            self.frame_act, text='登录', command=self.usr_login)
        self.button_sign_up = ttk.Button(
            self.frame_act, text='注册', command=self.usr_sign_up)

    def _layout(self):
        self.canvas.grid(row=0, column=0, sticky='we')
        self.frame_usr.grid(row=1, column=0, sticky='ns',
                            padx=5, pady=5, ipady=2)
        self.frame_act.grid(row=2, column=0, sticky='ns', padx=5, pady=5)
        self.label_usr_name.grid(row=0, column=0, sticky='we')
        self.entry_usr_name.grid(row=0, column=1, sticky='we')
        self.label_usr_pwd.grid(row=1, column=0, sticky='we')
        self.entry_usr_pwd.grid(row=1, column=1, sticky='we')
        self.button_login.grid(row=0, column=0, sticky='we')
        self.button_sign_up.grid(row=0, column=1, sticky='we')

    def usr_login(self):
        '''用户登录的行为'''
        pass

    def usr_sign_up(self):
        '''用户注册的行为'''
        pass

此代码实现了当鼠标的光标进入到密码的输入框时,显示密码,离开后密码显示为 '*'

2 设置用户的注册行为

我们需要定义如下函数:

class HelloWindow(Tk):
    ...
    def test_user_name(self, user_name):
        if user_name:
            if user_name[0].isalpha() and len(user_name) > 2:
                return True
            
    def test_user_pwd(self, user_pwd):
        if user_pwd:
            if user_pwd[0].isalpha() and len(user_pwd) > 6:
                return True
            
    def write_user_info(self, new_user_info, users_info):
        users_info.update(new_user_info)
        with open('users_info.json', 'w', encoding='utf-8') as fp:
            json.dump(users_info, fp)
            
    def load_users_info(self):
        try:
            with open('users_info.json', 'r', encoding='utf-8') as fp:
                users_info = json.load(fp)
        except FileNotFoundError:
            users_info = {}
        return users_info

    def usr_sign_up(self):
        '''用户注册的行为'''
        user_name = self.entry_usr_name.get()
        user_pwd = self.entry_usr_pwd.get()
        users_info = self.load_users_info()
        cond = user_name not in users_info
        cond1 = self.test_user_name(user_name) and self.test_user_pwd(user_pwd)
        if cond and cond1:
            self.write_user_info(users_info, {user_name:user_pwd})
            messagebox.showinfo('', "注册成功!")
        else:
            messagebox.showerror('注册失败!', "请检查您的输入")

定义 usr_sign_up 函数用于用户的注册行为。这里仅仅写了一个简单的注册机制:

  1. 用户名和密码的第一个字符必须为“字母”;
  2. 用户名的长度不得少于 2 字符。
  3. 密码的长度不得少于 6 字符。
  4. 如果注册成功,则将用户的名称与密码保存进 'users_info.json' 文件。

您可以通过修改 test_user_nametest_user_pwd 函数,设置更加复杂的注册机制。

3 设置用户的登录行为

登录行为比较容易设定:

class HelloWindow(Tk):
    ...
    def usr_login(self):
        '''用户登录的行为'''
        user_name = self.entry_usr_name.get()
        user_pwd = self.entry_usr_pwd.get()
        users_info = self.load_users_info()
        user_info = {user_name:user_pwd}
        cond = set(user_info.items()) < set(users_info.items())
        if cond:
            messagebox.showinfo('', "登录成功!")
        else:
            messagebox.showerror('登录失败!', "请检查您的输入")

最终的效果图:

完整的代码:

举报

相关推荐

Qt登录窗口

3.12

3.12study

登录注册窗口(一)

3.12学习汇报

MFC代码创建窗口

POI创建冻结窗口

0 条评论