Python编程教程:用tkinter写个密码器

python内置的GUI编程tkinter小巧灵活,本文以密码码器示例,所有注册的用户皆会被持久化

流程

用户登录/注册,成功则提示欢迎语,不正确或密码错误有相应警告


不存在帐户则提醒注册,并回调子页面注册,需要密码确认,注册已存在用户会被提醒

结构

两个window窗口,一个负责主界面引入了背景图,一个子负责注册账号密码,ui以tk为后缀名。event为tk的事件回调,store以pickle字典序列化存储类,usrs.pickle为持久化存储

entry

│  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.pyc

        login.cpython-37.pyc

        sign_up_tk.cpython-37.pyc

        store.cpython-37.pyc

入口UI

login_tk.py

from tkinter import *

from tkinter import ttk

from event import login

from sign_up_tk import usr_sign_up

"""

定义界面

"""

# 1. 根实例

root = Tk()

root.title("Wellcome to Login")

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='欢迎使用密码器', font=('Arial', 16)).pack()

# 3.用户静态文本

ttk.Label(root, text='用户:', font=('Arial', 14)).place(x=50, y=185)

ttk.Label(root, text='密码:', 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='登录', command=lambda: login(

    uname.get(), pwd.get())).place(x=120, y=270)

# 8. 注册加子页面

ttk.Button(root, text='注册', command=lambda: usr_sign_up(

    root)).place(x=250, y=270)

# 6.事件循环

root.mainloop()

注册UI

sign_up_tk.py

from tkinter import *

from tkinter import ttk

from event import sign_up_web

def usr_sign_up(root):

    # 定义在主窗口上的次窗口

    window_sign_up = Toplevel(root)

    window_sign_up.geometry('300x200')

    window_sign_up.title('注册')

    # 用户名

    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)

    # 密码

    new_pwd = StringVar()

    ttk.Label(window_sign_up, text='密码: ').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='重复密码: ').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='注册', command=lambda: sign_up_web(new_pwd.get(), new_pwd_confirm.get(), uname.get(), window_sign_up)).place(x=180, y=120)

事件回调

event.py

from tkinter import *

from tkinter import ttk

import tkinter.messagebox as msgbox

from store import Store

"""

回调事件模块

"""

def login(uname, pwd):

    usrs_info = Store()._usrs

    if uname in usrs_info:

        if pwd == usrs_info[uname]:

            msgbox.showinfo(

                title="欢迎您", message='您还好吗? ' + uname)

        else:

            msgbox.showerror(

                message='错误! 密码不正确, 请重试.')

    else:

        msgbox.askyesno(

            '欢迎 '+uname, '你还没有注册,请先注册')

def sign_up_web(pwd,confirm,uname,window_sign_up):

    db = Store()

    if pwd != confirm:

        print(pwd,confirm)

        msgbox.showerror(

            '错误', '两次输入的密码不一致!')

    elif uname in db._usrs:

        msgbox.showerror('警告', '该用户已经注册过!')

    else:

        # 注册新用户

        db.add(uname,pwd).save()

        msgbox.showinfo(

            '欢迎'+uname, '您已经注册成功!')

        # 销毁注册窗口

        window_sign_up.destroy()

存储类

import pickle

"""

数据存储模块

"""

class Store:

    def __init__(self, db="usrs.pickle"):

        self._db = db

        self._usrs = self._read()

    def _read(self):

        try:

            # 反序列化对象

            with open(self._db, 'rb') as f:

                self._usrs = pickle.load(f)

        except FileNotFoundError:

            # 序列化对象

            with open(self._db, 'wb') as f:

                # 默认内置管理员

                self._usrs = {'admin': '123456'}

                # 持久化写入文件

                pickle.dump(self._usrs, f)

        return self._usrs

    # 持久化

    def save(self):

        with open(self._db, 'wb') as f:

            pickle.dump(self._usrs, f)

            f.close()


    # 添加新用户

    def add(self, uname, pwd):

        self._usrs[uname] = pwd

        return self

    def show(self):

        print(self._usrs)

db = Store()

# db.add("zhansang","654321")

# db.save()

db.show()

其它

tk图像类只支持gif及png等有限图片,布局管理支持相对定位(pack自动计算),坐标系place,grid栅格系统

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容