因为项目需要开发界面,自己不得不做一些界面的设计。因为这是第一次上手,参考了很多资料,向其致谢。这个小项目也只是一个半成品,直接删除有点可惜,因此放在这里希望对看到的小伙伴有所帮助。

 

首先直接上完整代码

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。

python的界面开发 python界面开发tk_后端

 首先是包的导入,其中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')

python的界面开发 python界面开发tk_python的界面开发_02

python的界面开发 python界面开发tk_后端_03

#背景导入
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)

 后面就是一些具体的函数,大家可以按需自行解决。

 最后的效果如图所示。

python的界面开发 python界面开发tk_用户名_04