因为项目需要开发界面,自己不得不做一些界面的设计。因为这是第一次上手,参考了很多资料,向其致谢。这个小项目也只是一个半成品,直接删除有点可惜,因此放在这里希望对看到的小伙伴有所帮助。
首先直接上完整代码
from tkinter import *
import tkinter.messagebox
import pickle
from PIL import Image, ImageTk
#初始化Tk()
myWindow = Tk()
#设置标题“遥感变化检测”
myWindow.title("欢迎进入遥感变化检测系统")
#设置窗口大小,380*300较为合适
width = 380
height = 300
#使界面居于屏幕中央
screenwidth = myWindow.winfo_screenwidth()
screenheight = myWindow.winfo_screenheight()
alignstr = '%dx%d+%d+%d'%(width,height,(screenwidth-width)/2,(screenheight-height)/2)
myWindow.geometry(alignstr)
#设置窗口可变
myWindow.resizable(width = True,height = True)
#创建容器
frm_1 = tkinter.Frame(myWindow,width = 380,height = 300)
frm_1.pack()
#界面背景
canvas_1 = tkinter.Canvas(frm_1, height=300, width=380)
image_file_1 = tkinter.PhotoImage(file=r'C:\Users\yechengji\Desktop\tk\pictures\backgrand_1.gif')
image_file_2 = tkinter.PhotoImage(file=r'C:\Users\yechengji\Desktop\tk\pictures\backgrand_2.gif')
#背景导入
image = canvas_1.create_image(0, 0, anchor='nw', image=image_file_1)
canvas_1.pack()
#登录界面设置,标签,用户名和密码
tkinter.Label(frm_1,text='用户名:').place(x=90,y=100)
tkinter.Label(frm_1,text='密码:').place(x=90,y=140)
#用户名输入框
var_usr_name=tkinter.StringVar()
entry_usr_name=tkinter.Entry(frm_1,textvariable=var_usr_name)
entry_usr_name.place(x=145,y=100)
#密码输入框
var_usr_pwd=tkinter.StringVar()
entry_usr_pwd=tkinter.Entry(frm_1,textvariable=var_usr_pwd,show='*')
entry_usr_pwd.place(x=145,y=140)
#登录函数
def usr_log_in():
#输入框获取用户名密码
usr_name=var_usr_name.get()
usr_pwd=var_usr_pwd.get()
#从本地字典获取用户信息,如果没有则新建本地数据库
try:
with open('usr_info.pickle','rb') as usr_file:
usrs_info=pickle.load(usr_file)
except FileNotFoundError:
with open('usr_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]:
tkinter.messagebox.showinfo(title='welcome',message='欢迎您:'+usr_name)
carte()
crope_init()
else:
tkinter.messagebox.showerror(message='密码错误')
#用户名密码不能为空
elif usr_name=='' or usr_pwd=='' :
tkinter.messagebox.showerror(message='用户名或密码为空')
#不在数据库中弹出是否注册的框
else:
is_signup=tkinter.messagebox.askyesno('欢迎','您还没有注册,是否现在注册')
if is_signup:
usr_sign_up()
#注册函数
def usr_sign_up():
#确认注册时的相应函数
def signtowcg():
#获取输入框内的内容
nn=new_name.get()
np=new_pwd.get()
npf=new_pwd_confirm.get()
#本地加载已有用户信息,如果没有则已有用户信息为空
try:
with open('usr_info.pickle','rb') as usr_file:
exist_usr_info=pickle.load(usr_file)
except FileNotFoundError:
exist_usr_info={}
#检查用户名存在、密码为空、密码前后不一致
if nn in exist_usr_info:
tkinter.messagebox.showerror('错误','用户名已存在')
elif np =='' or nn=='':
tkinter.messagebox.showerror('错误','用户名或密码为空')
elif np !=npf:
tkinter.messagebox.showerror('错误','密码前后不一致')
#注册信息没有问题则将用户名密码写入数据库
else:
exist_usr_info[nn]=np
with open('usr_info.pickle','wb') as usr_file:
pickle.dump(exist_usr_info,usr_file)
tkinter.messagebox.showinfo('欢迎','注册成功')
#注册成功关闭注册框
window_sign_up.destroy()
#新建注册界面
window_sign_up=tkinter.Toplevel(frm_1)
window_sign_up.title('注册')
#使界面居于屏幕中央
screenwidth_1 = window_sign_up.winfo_screenwidth()
screenheight_1 = window_sign_up.winfo_screenheight()
alignstr_1 = '%dx%d+%d+%d'%(350,200,(screenwidth_1-350)/2,(screenheight_1-200)/2)
window_sign_up.geometry(alignstr_1)
#用户名变量及标签、输入框
new_name=tkinter.StringVar()
tkinter.Label(window_sign_up,text='用户名:').place(x=10,y=10)
tkinter.Entry(window_sign_up,textvariable=new_name).place(x=150,y=10)
#密码变量及标签、输入框
new_pwd=tkinter.StringVar()
tkinter.Label(window_sign_up,text='请输入密码:').place(x=10,y=50)
tkinter.Entry(window_sign_up,textvariable=new_pwd,show='*').place(x=150,y=50)
#重复密码变量及标签、输入框
new_pwd_confirm=tkinter.StringVar()
tkinter.Label(window_sign_up,text='请再次输入密码:').place(x=10,y=90)
tkinter.Entry(window_sign_up,textvariable=new_pwd_confirm,show='*').place(x=150,y=90)
#确认注册按钮及位置
bt_confirm_sign_up=tkinter.Button(window_sign_up,text='确认注册',command=signtowcg)
bt_confirm_sign_up.place(x=150,y=130)
#退出的函数
def usr_sign_quit():
myWindow.destroy()
#页面清空函数
def carte():
for widget in frm_1.winfo_children():
widget.destroy()
#创建操作界面
def crope_init():
image = canvas_1.create_image(0, 0, anchor = 'nw', image = image_file_2)
canvas_1.pack()
bt_logup_1 = tkinter.Button(frm_1,text='注册')
bt_logup_1.place(x=50,y=130)
#登录 注册按钮
bt_login = tkinter.Button(frm_1,text='登录',command=usr_log_in)
bt_login.place(x=80,y=230)
bt_logup = tkinter.Button(frm_1,text='注册',command=usr_sign_up)
bt_logup.place(x=180,y=230)
bt_logquit = tkinter.Button(myWindow,text='退出',command=usr_sign_quit)
bt_logquit.place(x=280,y=230)
#frm_1.pack()
#进入界面循环
myWindow.mainloop()
在界面开发之前需要一些环境准备,python安装和IDE配置。这里使用的是python3.7,这是一个较为稳定的版本,使用体验很好。IDE推荐使用VS code,这是微软的轻量级IDE,对新手很友好,大型开发使用PyCharm和VS 2019更佳。
VS code需要经过一些配置才能够满足正常使用,简单来说安装python扩展即可使用,但是想要使用的更加舒服可以使用一些外加扩展,实现高亮、主题、代码补全等,例如One Dark Pro。
首先是包的导入,其中PIL实现图片的导入,不使用PIL模块则tk本身只支持GIF格式,不太清晰。本文没有完成其他格式图片的导入,读者可使用PIL模块自行探索。其中tk模块是python自身库,不需要安装,PIL已经改名pillow。推荐使用国内源安装,我使用的是清华源。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pillow
其次是窗口一些基本属性的设置,创建,大小,标题,位置等等。其中使用winfo获取屏幕大小。窗口可变,true则支持改变窗口尺寸,反则不支持。
#初始化Tk()
myWindow = Tk()
#设置标题“遥感变化检测”
myWindow.title("欢迎进入遥感变化检测系统")
#设置窗口大小,380*300较为合适
width = 380
height = 300
#使界面居于屏幕中央
screenwidth = myWindow.winfo_screenwidth()
screenheight = myWindow.winfo_screenheight()
alignstr = '%dx%d+%d+%d'%(width,height,(screenwidth-width)/2,(screenheight-height)/2)
myWindow.geometry(alignstr)
#设置窗口可变
myWindow.resizable(width = True,height = True)
页面布局,使用frame创建容器,后期利于修改。我这里采用画布组件导入图片。我有一个问题自己还没有解决,当你需要在函数里面导入图片时会出一些问题。图片不能直接改变后缀,这样于事无补,可以使用window自带的画图软件另存为GIF格式。推荐使用绝对路径。放两张GIF格式的图片。可以明显看出GIF格式的图片分辨率较低,清晰度不够。
#创建容器
frm_1 = tkinter.Frame(myWindow,width = 380,height = 300)
frm_1.pack()
#界面背景
canvas_1 = tkinter.Canvas(frm_1, height=300, width=380)
image_file_1 = tkinter.PhotoImage(file=r'C:\Users\yechengji\Desktop\tk\pictures\backgrand_1.gif')
image_file_2 = tkinter.PhotoImage(file=r'C:\Users\yechengji\Desktop\tk\pictures\backgrand_2.gif')
接下来是界面设计,一些标签,输入框等等。可以参考下面的博客。使用tkinter加载png,jpg - 蝉时雨 - 博客园 (cnblogs.com)https://www.cnblogs.com/semishigure/p/8124397.html
#背景导入
image = canvas_1.create_image(0, 0, anchor='nw', image=image_file_1)
canvas_1.pack()
#登录界面设置,标签,用户名和密码
tkinter.Label(frm_1,text='用户名:').place(x=90,y=100)
tkinter.Label(frm_1,text='密码:').place(x=90,y=140)
#用户名输入框
var_usr_name=tkinter.StringVar()
entry_usr_name=tkinter.Entry(frm_1,textvariable=var_usr_name)
entry_usr_name.place(x=145,y=100)
#密码输入框
var_usr_pwd=tkinter.StringVar()
entry_usr_pwd=tkinter.Entry(frm_1,textvariable=var_usr_pwd,show='*')
entry_usr_pwd.place(x=145,y=140)
后面就是一些具体的函数,大家可以按需自行解决。
强调一下布局,tk有pack,place,grid等三种布局模式。尽量不要混用。可参考下面这篇博客。
tkinter 布局管理 - 简书 (jianshu.com)https://www.jianshu.com/p/f53625382e30
最后的效果如图所示。