python设计一个窗体、模拟登录页面_tkinter+pickle+python的一个登录界面设计

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('[email protected]') #初始化信息

#对应的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('[email protected]') #初始值传不过去

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('[email protected]') #初始值

#定义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()

2. 存在的问题bug:

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

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

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

图1

3.图

Python图形编程探索系列-07-程序登录界面设计

设计任务 初步设计程序登录界面,详细分析设计步骤. 程序详细分析 基本框架设计 import tkinter as tk import tkinter.messagebox root = tk.Tk( ...

winform设计一个登录界面和修改密码的界面-自动切换窗体(问题[已解] 望一起讨论)(技术改变世界-cnblog)

http://www.cnblogs.com/IAmBetter/archive/2012/01/14/2322156.html winform设计一个登录界面和修改密码的界面-自动切换窗体(问题[已 ...

少量代码设计一个登录界面(二) – .NET CORE(C#) WPF开发

微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. 阅读导航 本文背景 代码实现 本文参考 源码 1. 本文背景 同上篇文章

少量代码设计一个登录界面 - .NET CORE(C#) WPF开发

微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. 少量代码设计一个登录界面 - .NET CORE(C#) WPF开发 阅读导航 本文背景 代码 ...

使用Axure RP原型设计实践03,制作一个登录界面的原型

本篇体验做一个登录界面的原型. 登录页 首先在Page Style里为页面设置背景色. 如果想在页面中加图片,就把Image部件拖入页面,并设置x和y轴.双击页面中的Image部件可以导入图片.在Im ...

第四篇——Spring音乐登录界面设计及实现(C#)

Spring音乐播放器,我们小组设计其启动时有一个登录界面,用户初次可以注册,输入用户名和密码,点击注册即将输入信息保存到register文本文件中:如果已有用户名,输入用户名和密码,点击登录,程序会 ...

二、Django用Eclipse编写一个登录界面

一.Django用Eclipse编写一个登录界面 二.Django用Eclipse编写一个登录界面Ajax和Django交互 各软件版本:Python 2.7.14,django 1.6.11 原来已 ...

一、Django用Eclipse编写一个登录界面

一.Django用Eclipse编写一个登录界面 二.Django用Eclipse编写一个登录界面Ajax和Django交互 Eclipse安装Python插件和Django的步骤直接省略. 创建de ...

Qt常用的登录界面设计

记录一下Qt常用的登录界面的设计 方便以后使用! 1.QpushButton改变一个按钮的颜色,当鼠标放上去和移开时显示不同的颜色.QPushButton { background-color: rg ...

随机推荐

Content Security Policy 入门教程

阮一峰文章:Content Security Policy 入门教程

JS组件系列——两种bootstrap multiselect组件大比拼

前言:今天继续来看看bootstrap的另一个组件:multiselect.记得在项目开始之前,博主项目组几个同事就使用哪些js组件展开过讨论,其中就说到了select组件,由于项目的整体风格使用的b ...

挂FORM时找不到对应的功能(function)

表单 功能都已经定义,但是在菜单中增加时候没有这个可选的项. 解决办法:由于是功能太多,LOV显示限制为30000,因此将功能名前加CUX,提升其排序即可.也可以修改LOV显示限制数量.

Java 正则表达式[转载]

PS:转载自CSDN博客看上去很美 众所周知,在程序开发中,难免会遇到需要匹配.查找.替换.判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力.因此,学 ...

Asp.net Mvc4 使用Cas单点登录

因项目需要,使用了耶鲁大学的Cas单点登录方案,在java中使用一直正常,但是在.Net中碰到了循环重定向的问题,反复测试后,总算解决了,最终的配置如下:

android和ios,音频互通方案

好久不更新博客上,从年前从公司辞职,这半年以来,一直靠做一些外包app养活自己!也算是达成了自己年前制定的目标!可是也想着总不能一直做外包吧,所以决定做一些自己觉得有意思的app,挂到应用商店上和ap ...

基于ZooKeeper的Dubbo简单抽样登记中心

一:设备zookeeper 系统环境 Ubuntu 14.04.2 LTS x64 IP : 192.168.1.102 下载zookeeper-3.4.6.tar.gz到文件夹/opt.拉开拉链 m ...

Vue.js新城之勇者探秘录

那么我们就继续来聊聊学习Vue的一些方法?以下的学习思路可以供大家作为参考: 1.视频教程带你入门:初学者如果没有MVVM模式的基础学习Vue,可能初期切换思路有比较大的难度,这个时候可以借助视频教程 ...

责任链模式(Chain of Responsibility)

定义:为一个请求定义含有链状关系的接受对象,基于请求的类型,松耦合发送者和接受者之间的关系. 实现方式: 首先定义一个抽象类,包括一个公共抽象行为和决定子类链状关系的属性,然后创建一系列对象继承这个抽 ...

作业1-MathExam

MathExam 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 10 30 • Estim ...

你可能感兴趣的:(python设计一个窗体,模拟登录页面)