python的tkinter使用实例 适合零基础者食用

我就是sHt。代码也是。
上代码:

"""
    @Author xlf
    @Team occamedu
    @Email 956324914@qq.com
    @Time 2021/4/16 11:05
"""

import tkinter as tk
import tkinter.messagebox
import pickle
from tkinter import *
from sys import exit

# 第1步,实例化object,建立窗口window
from tkinter import scrolledtext

window = tk.Tk()

# 第2步,给窗口的可视化起名字
window.title('学生信息录入与显示 designed by xlf')

# 第3步,设定窗口的大小(长 * 宽)
window.geometry('600x600')  # 这里的乘是小x

tk.Label(window, text='录入学生信息', font=('Arial', 30)).pack()
tk.Label(window, text='学生信息展示', font=('Arial', 30)).place(x=180, y=170)

# 第5步,用户信息
tk.Label(window, text='学号:', font=('宋体', 14)).place(x=100, y=60)
tk.Label(window, text='姓名:', font=('宋体', 14)).place(x=100, y=90)
tk.Label(window, text='专业:', font=('宋体', 14)).place(x=100, y=120)

# 第6步,用户登录输入框entry
# 用户密码
var_usr_no = tk.StringVar()
var_usr_no.set('201921130099')
entry_usr_no = tk.Entry(window, textvariable=var_usr_no, font=('Arial', 14))
entry_usr_no.place(x=190, y=60)
# 用户名
var_usr_name = tk.StringVar()
var_usr_name.set('xlf')
entry_usr_name = tk.Entry(window, textvariable=var_usr_name, font=('Arial', 14))
entry_usr_name.place(x=190, y=90)

# 用户专业
var_usr_major = tk.StringVar()
var_usr_major.set('cs')
entry_usr_major = tk.Entry(window, textvariable=var_usr_major, font=('Arial', 14))
entry_usr_major.place(x=190, y=120)


scr = scrolledtext.ScrolledText(window, width=65, height=12, font=("隶书", 12))  # 滚动文本框(宽,高(这里的高应该是以行数为单位),字体样式)
scr.place(x=50, y=220)
with open('usrs_info.pickle', 'rb') as usr_file:
    usrs_info = pickle.load(usr_file)
    for item in usrs_info:
        # s = '姓名:'+ usrs_info[item]['name']
        s = usrs_info[item]
        scr.insert(END, s)
        scr.insert(END, '\n')


# 第8步,定义用户登录功能
def usr_add():
    # 这两行代码就是获取用户输入的usr_name和usr_pwd
    usr_name = var_usr_name.get()
    usr_no = var_usr_no.get()
    usr_major = var_usr_major.get()

    # 学号、姓名和专业不能为空,若为空,则提示重新输入
    if len(usr_no) == 0:
        tkinter.messagebox.showinfo(title='提示', message='学号不能为空')
    elif len(usr_name) == 0:
        tkinter.messagebox.showinfo(title='提示', message='姓名不能为空')
    elif len(usr_major) == 0:
        tkinter.messagebox.showinfo(title='提示', message='专业不能为空')
    # 学号必须是数字,姓名和专业必须是字符
    elif not usr_no.isdigit():
        tkinter.messagebox.showinfo(title='提示', message='学号必须是数字,请重新输入')
    elif not usr_name.isalpha():
        tkinter.messagebox.showinfo(title='提示', message='姓名必须是字符,请重新输入')
    elif not usr_major.isalpha():
        tkinter.messagebox.showinfo(title='提示', message='专业必须是字符,请重新输入')

    else:
        # 这里设置异常捕获,当我们第一次访问用户信息文件时是不存在的,所以这里设置异常捕获。
        # 中间的两行就是我们的匹配,即程序将输入的信息和文件中的信息匹配。
        try:
            with open('usrs_info.pickle', 'rb') as usr_file:
                usrs_info = pickle.load(usr_file)
                flag = False
                if usr_no in usrs_info:
                    flag = True
                usr_file.close()

                if flag:
                    tkinter.messagebox.showinfo(title='提示', message='该学生信息已在系统中')
                else:
                    with open('usrs_info.pickle', 'wb') as usr_file:
                        usrs_info[usr_no] = {'name': usr_name, 'usr_no': usr_no, 'usr_major': usr_major}
                        pickle.dump(usrs_info, usr_file)
                        scr.insert(END, usrs_info[usr_no])
                        tkinter.messagebox.showinfo(title='提示', message='录入成功')

        except EOFError:
            # 这里就是我们在没有读取到`usr_file`的时候,程序会创建一个`usr_file`这个文件,并将管理员信息写入,即用户名为`admin`密码为`admin`。
            with open('usrs_info.pickle', 'wb') as usr_file:
                usrs_info = {'201921130099': [{'name': 'xlf', 'major': 'cs', 'usr_no': '201921130099'}]}
                pickle.dump(usrs_info, usr_file)
                usr_file.close()  # 必须先关闭,否则pickle.load()会出现EOFError: Ran out of input


# 第9步,清空entry中的内容
def reset():
    var_usr_no.set('')
    var_usr_name.set('')
    var_usr_major.set('')


# 第10步,展示已录入的学生信息


# 第7步,login and sign up 按钮
btn_login = tk.Button(window, text='重新录入', command=reset)
btn_login.place(x=440, y=60)
btn_sign_up = tk.Button(window, text='录入信息', command=usr_add)
btn_sign_up.place(x=440, y=90)
btn_quit = tk.Button(window, text='关闭窗口', command=exit)
btn_quit.place(x=440, y=120)

window.mainloop()

最后效果图:

—————————————分割线-----------------------------------------------

更新一下,在源代码的基础上,修改了数据展示的格式,在第一次有学生信息被录入时,在D盘创建student文件夹,在其中创建stuInfo.txt,stuInfo.xlsx。每当有学生信息录入,同步追加到stuInfo.txt,stuInfo.xlsx。这种做法效率很低,可以考虑使用缓存,或者添加两个button(这就涉及到产品需求了)。总而言之,还是a piece of sht。不要看,快跑,容易脏了你们的眼。

"""
  @Author xlf
    @Team occamedu
    @Email 956324914@qq.com
    @Time 2021/4/16 11:05
"""

import tkinter as tk
import tkinter.messagebox
import pickle
import os
import openpyxl
from tkinter import *
from sys import exit
from tkinter import scrolledtext

dir_path = 'D:\\student'
text_path = 'D:\\student\\stuInfo.txt'
excel_path = 'D:\\student\\stuInfo.xlsx'


def make_str_readable(element):
    str_output = str(element)
    str_output = str_output.replace('[', '').replace(']', '').replace('{', '').replace('}', '')  # 去除[]{}
    str_output = str_output.replace("'", '').replace(',', '') + '\n'  # 去除单引号,逗号,每行末尾追加换行符
    str_output = str_output.replace("name", '姓名').replace('usr_no', '学号').replace('usr_major', '专业').replace('major',
                                                                                                             '专业') + '\n'
    return str_output


def write_excel_xlsx(path, sheet_name, value):
    index = len(value)
    workbook = openpyxl.Workbook()  # 新建工作簿(默认有一个sheet?)
    sheet = workbook.active  # 获得当前活跃的工作页,默认为第一个工作页
    sheet.title = sheet_name  # 给sheet页的title赋值
    for i in range(0, index):
        for j in range(0, len(value[i])):
            sheet.cell(row=i + 1, column=j + 1, value=str(value[i][j]))  # 行,列,值 这里是从1开始计数的
    workbook.save(path)  # 一定要保存


def append_excel_xlsx(path, value):
    data = openpyxl.load_workbook(path)

    table = data.active
    nrows = table.max_row  # 获得行数

    # 注意行业列下标是从1开始的
    for i in range(1, len(value) + 1):
        table.cell(nrows + 1, i).value = value[i - 1]

    data.save(path)

# 第1步,实例化object,建立窗口window
window = tk.Tk()

# 第2步,给窗口的可视化起名字
window.title('学生信息录入与显示 designed by xlf')

# 第3步,设定窗口的大小(长 * 宽)
window.geometry('600x600')

tk.Label(window, text='录入学生信息', font=('Arial', 30)).pack()
tk.Label(window, text='学生信息展示', font=('Arial', 30)).place(x=180, y=170)

# 第5步,用户信息
tk.Label(window, text='学号:', font=('宋体', 14)).place(x=100, y=60)
tk.Label(window, text='姓名:', font=('宋体', 14)).place(x=100, y=90)
tk.Label(window, text='专业:', font=('宋体', 14)).place(x=100, y=120)

# 第6步,用户输入框entry

var_usr_no = tk.StringVar()
var_usr_no.set('201921130099')
entry_usr_no = tk.Entry(window, textvariable=var_usr_no, font=('Arial', 14))
entry_usr_no.place(x=190, y=60)
# 用户名
var_usr_name = tk.StringVar()
var_usr_name.set('xlf')
entry_usr_name = tk.Entry(window, textvariable=var_usr_name, font=('Arial', 14))
entry_usr_name.place(x=190, y=90)

# 用户专业
var_usr_major = tk.StringVar()
var_usr_major.set('cs')
entry_usr_major = tk.Entry(window, textvariable=var_usr_major, font=('Arial', 14))
entry_usr_major.place(x=190, y=120)

scr = scrolledtext.ScrolledText(window, width=65, height=20, font=("隶书", 12))  # 滚动文本框(宽,高(这里的高应该是以行数为单位),字体样式)
scr.place(x=50, y=220)
if os.path.exists('usrs_info.pickle'):
    with open('usrs_info.pickle', 'rb') as usr_file:
        usrs_info = pickle.load(usr_file)
        for item in usrs_info:
            s = make_str_readable(usrs_info[item])
            scr.insert(END, s)
            scr.insert(END, '\n')


# 第8步,定义用户功能
def usr_add():
    # 这三行代码就是获取用户输入
    usr_name = var_usr_name.get()
    usr_no = var_usr_no.get()
    usr_major = var_usr_major.get()

    # 学号、姓名和专业不能为空,若为空,则提示重新输入
    if len(usr_no) == 0:
        tkinter.messagebox.showinfo(title='提示', message='学号不能为空')
    elif len(usr_name) == 0:
        tkinter.messagebox.showinfo(title='提示', message='姓名不能为空')
    elif len(usr_major) == 0:
        tkinter.messagebox.showinfo(title='提示', message='专业不能为空')
    # 学号必须是数字,姓名和专业必须是字符
    elif not usr_no.isdigit():
        tkinter.messagebox.showinfo(title='提示', message='学号必须是数字,请重新输入')
    elif len(usr_no) != 12:
        tkinter.messagebox.showinfo(title='提示', message='学号必须是十一位数字,请重新输入')
    elif not usr_name.isalpha():
        tkinter.messagebox.showinfo(title='提示', message='姓名必须是字符,请重新输入')
    elif not usr_major.isalpha():
        tkinter.messagebox.showinfo(title='提示', message='专业必须是字符,请重新输入')

    else:
        # 这里设置异常捕获,当我们第一次访问用户信息文件时是不存在的,所以这里设置异常捕获。。
        try:
            with open('usrs_info.pickle', 'rb') as usr_file:
                usrs_info = pickle.load(usr_file)
                flag = False
                # 将学号作为主键判断学生信息是否已录入
                if usr_no in usrs_info:
                    flag = True
                usr_file.close()

                if flag:
                    tkinter.messagebox.showinfo(title='提示', message='该学生信息已在系统中')
                else:
                    with open('usrs_info.pickle', 'wb') as usr_file:
                        usrs_info[usr_no] = {'name': usr_name, 'usr_no': usr_no, 'usr_major': usr_major}
                        pickle.dump(usrs_info, usr_file)
                        str_out = make_str_readable(usrs_info[usr_no])
                        scr.insert(END, str_out)
                        scr.insert(END, '\n')
                        # 同步更新文本和excel
                        with open(text_path, 'a') as text_file:
                            text_file.write(usr_no + '      ' + usr_name + '             ' + usr_major + '\n')
                        insert_value = [usr_no, usr_name, usr_major]
                        append_excel_xlsx(excel_path, insert_value)
                        tkinter.messagebox.showinfo(title='提示', message='录入成功')

        except (EOFError, FileNotFoundError):
            # 这里就是我们在没有读取到`usr_file`的时候,程序会创建一个`usr_file`这个文件,并将管理员信息写入,即用户名为`admin`密码为`admin`。
            with open('usrs_info.pickle', 'wb') as usr_file:
                usrs_info = {}
                usrs_info[usr_no] = {'name': usr_name, 'usr_no': usr_no, 'usr_major': usr_major}
                pickle.dump(usrs_info, usr_file)
                tkinter.messagebox.showinfo(title='提示', message='录入成功')
                str_init = make_str_readable(usrs_info[usr_no])
                scr.insert(END, str_init)
                scr.insert(END, '\n')
                if not os.path.exists(dir_path):
                    os.makedirs(dir_path)
                with open(text_path, 'a') as text_file:
                    text_file.write(
                        '       ' + ' 学号' + '               ' + '姓名' + '               ' + '专业' + '  ' + '\n')
                    text_file.write(usr_no + '      ' + usr_name + '             ' + usr_major + '\n')
                out_excel_value = [['学号', '姓名', '专业'],
                                   [usr_no, usr_name, usr_major]]
                write_excel_xlsx(excel_path, 'stuInfo designed by xlf', out_excel_value)
                usr_file.close()  # 必须先关闭,否则pickle.load()会出现EOFError: Ran out of input


# 第9步,清空entry中的内容
def reset():
    var_usr_no.set('')
    var_usr_name.set('')
    var_usr_major.set('')


# 第7步,login and sign up 按钮
btn_login = tk.Button(window, text='重新录入', command=reset)
btn_login.place(x=440, y=60)
btn_sign_up = tk.Button(window, text='录入信息', command=usr_add)
btn_sign_up.place(x=440, y=90)
btn_quit = tk.Button(window, text='关闭窗口', command=exit)
btn_quit.place(x=440, y=120)

window.mainloop()

效果不截图了,懒。

  • 8
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值