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()

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的一个登录界面设计的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. gtk---实现一个登录界面

    输入框 如果在GTK+中需要输入一个字符串,可以使用输入框,这是一个单行的输入构件,可以用于输入和显示正文内容. 输入框的基本操作函数 1.gtk_entry_new(void); 这是新建一个输入框 ...

随机推荐

  1. 题解【洛谷P1983】[NOIP2013]车站分级

    题面 题解 不难想到拓扑排序 于是每一个等级高的向等级低的连一条边 考虑拓扑排序过程中的分层 对于每个点进行分层 于是答案就是这些点中的最大层数 然后就会RE 发现我们多连了一些重复的边 用一个标记数 ...

  2. 题解【洛谷P1618】 三连击(升级版)

    设三个数分别为n1.n2.n3,因为三个数的比为A:B:C,取一份量i,使得A·i=x,B·i=y,C·i=z(·是*的意思). 所以我们的代码只需要枚举i,并以此判断n1.n2.n3是否为三位数且包 ...

  3. HTML列表,表格与媒体元素

    一.无序列表 <ul> <li>无序列表</li> <li>有序列表</li> <li>自定义列表</li> < ...

  4. vue -- v-model 表单绑定

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. python面试的100题(11)

    21.Python-遍历列表时删除元素的正确做法 遍历在新在列表操作,删除时在原来的列表操作 a = [1,2,3,4,5,6,7,8] print(id(a)) print(id(a[:])) fo ...

  6. Jquery动态改变my97datepicker的日期形式

    先要解绑触发事件: $('#start').unbind('focus'); 然后再绑定触发事件: $('#start').bind('focus',function(){WdatePicker({s ...

  7. C++-POJ3321-Apple Tree[数据结构][树状数组]

    树上的单点修改+子树查询 用dfn[u]和num[u]可以把任意子树表示成一段连续区间,此时结合树状数组就好了 #include <set> #include <map> #i ...

  8. 10day 字符集优化 重点

    什么是字符编码: 可以实现对非英文字符的支持 计算机操作系统是谁发明的? --美国人--英语 支持中文比较好的编码: UTF-8 比较通用 GBK 比较国际通用 出现乱码的原因: 01. 系统字符集设 ...

  9. DOJ1187 : 重建家园 (分数规划 && 二分 && kruskal)

    最优答案一定是一颗树 那么二分比值,不断kruskal找到最大可以满足的解就可以了 代码如下 #include <cstdio> #include <algorithm> us ...

  10. 通过FormData对象可以组装一组用 [XMLHttpRequest]发送请求的键/值对,它可以更灵活方便的发送表单数据。

    工作记录用 1 大概页面,点击选择按钮,选择文件,填写备注并可以上传前预览,然后点击上传按钮开始上传 2 html+js代码 <h2>Test</h2> <div id= ...