GUI程序设计——班级信息收集


 

题目:

程序(Python):

Step1. 安装wxPython

wxPython是一个成熟而且特性丰富的跨平台GUI工具包,由Robin Dunn 和Harri Pasanen开发,官方网址:http://wxpython.org。wxPython的安装非常简单,使用pip工具安装wxPython只需要一行命令(可以在cmd或者Spyder中输入):

pip install -U wxPython

wxPython的两个基础对象,应用程序对象和顶级窗口:

  • 应用程序对象管理主事件循环,主事件循环是wxPython程序的动力。如果没有应用程序对象,wxPython应用程序将不能运行。
  • 顶级窗口通常用于管理最重要的数据,控制并呈现给用户。

Step2.下载并安装好 MySQL 和 Navicate for MySQL

1、Navicate for MySQL中文破解版(下载&安装):

推荐网址:

https://www.cnblogs.com/yinfei/p/11427259.html

2、MySQL :

注意:

1、不同版本安装可能不同(见下链接看你对应的是哪一种)

2、64位和32位别下载混了

推荐网址1:

https://blog.csdn.net/weixin_43804496/article/details/115846430?spm=1001.2101.3001.6650.9&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~default-9.fixedcolumn&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~default-9.fixedcolumn

推荐网址2:

https://blog.csdn.net/liuzuoping/article/details/101931559

Step3. Create a MySQL 表 stu_information

现在开始正式解题!

# -*- coding: utf-8 -*-
"""
Created on Fri Dec 10 19:06:07 2021

@author: sailingXuan
"""

import pymysql

#打开数据库连接
db = pymysql.connect(host="localhost",user="root",password="11111",database="mysql")
#使用cursor()方法创建一个游标对象cursor
cursor = db.cursor()
#使用execute()方法执行SQL,如果表存在则删除
cursor.execute("DROP TABLE IF EXISTS stu_information")
#使用预处理语句创建表
sql = """
CREATE TABLE stu_information(
    id int(8) NOT NULL AUTO_INCREMENT,
    姓名 varchar(50) NOT NULL,
    班级 varchar(50) NOT NULL,
    学号 varchar(50) NOT NULL,
    PRIMARY KEY(id)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
"""
#执行SQL语句
cursor.execute(sql)
#关闭数据库连接
db.close()

Step2. 编写GUI,并连接到Navicate for MySQL中的表 stu_information

说明:

1、登录须满足的限制条件:

  1、输入的用户名和密码不得为空(Not NULL);

  2、用户名和密码需与表中的记录对应。

2、注册须满足:

  1、用户名和密码不得为空;

  2、不可以注册已存在的用户名。

# -*- coding: utf-8 -*-
"""
Created on Fri Dec 10 19:33:19 2021

@author: sailingXuan
"""
#任 35号程序员
import pymysql
# tkinter模块是Python的标准Tk GUI工具包的接口
from tkinter import *
from tkinter import messagebox

# 连接数据库
class MysqlSearch(object):
def __init__(self):
self.get_conn()

# 获取连接
def get_conn(self):
try:
self.conn = pymysql.connect(
host='localhost',
user='root',
passwd='11111',
db='mysql',
charset='utf8')
except pymysql.Error as e:
print('Error: %s' % e)

# 关闭连接
def close_conn(self):
try:
if self.conn:
self.conn.close()
except pymysql.Error as e:
print('Error: %s' % e)

# 获取用户信息(登录用)
def get_userinfo(self):
sql = 'SELECT * FROM stu_information'

# 使用cursor()方法获取操作游标
cursor = self.conn.cursor()

# 使用execute()方法执行SQL语句
cursor.execute(sql)

# 使用fetchall()方法获取全部数据
result = cursor.fetchall()

# 将数据用字典形式存储于result
result = [dict(zip([k[0] for k in cursor.description],row)) for row in result]

# 关闭连接
cursor.close()
self.close_conn()
return result

# 注册
def insert_userinfo(self,a,b,c):
self.a = a
self.b = b
self.c = c
sql = 'SELECT * FROM stu_information'
cursor = self.conn.cursor()
cursor.execute(sql)
result = cursor.fetchall()
result = [dict(zip([k[0] for k in cursor.description],row)) for row in result]
ulist = []
for item in result:
ulist.append(item['姓名'])
try:
# sql = 'INSERT INTO stu_information(用户名,班级,学号) VALUES(%s,%s,%s)'
cursor = self.conn.cursor()
cursor.execute('INSERT INTO stu_information(姓名,班级,学号) VALUES(%s,%s,%s)',(self.a,self.c,self.b))
if self.a == '' or self.b == '' or self.c == '':
self.conn.rollback()
messagebox.showerror('警告',message = '注册失败')
elif self.a in ulist:
messagebox.showerror('警告',message = '改同学已存在')
else:
# 提交事务
self.conn.commit()
messagebox.showinfo(title = '恭喜',message = '注册成功')
cursor.close()
self.close_conn()
except:
# 限制提交
self.conn.rollback()

def cancel():
# 清空同学输入的姓名和密码
user.set('')
passwd.set('')
cla.set('')

# 注册按钮事件的处理函数
def register():
register_name = entry_user.get()
register_cla = entry_cla.get()
register_pwd = entry_passwd.get()
obj_r = MysqlSearch()
obj_r.insert_userinfo(register_name,register_cla,register_pwd)

def login():
# 获取用户名和密码
obj = MysqlSearch()
result = obj.get_userinfo()
name = entry_user.get()
cla = entry_cla.get()
pwd = entry_passwd.get()
ulist = []
blist = []
plist = []
for item in result:
ulist.append(item['姓名'])
blist.append(item['班级'])
plist.append(item['学号'])
deter = True
for i in range(len(ulist)):
while True:
if name == ulist[i] and pwd == plist[i] and cla == blist[i]:
messagebox.showinfo(title = '恭喜',message = '登陆成功')# 登陆成功则执行begin函数
deter = False
break
else:
break
while deter:
messagebox.showerror('警告',message='姓名或学号错误')
break


# 创建应用程序窗口
win_login = Tk()
win_login.title('班级信息收集系')

# 禁止拉伸窗口
win_login.resizable(width = False, height = False)
win_login.geometry('600x300+382+183')

# 在窗口上创建标签组件
Label(win_login,text='姓名',font = ('微软雅黑'),justify=RIGHT,width=80).place(x=190,y=40,width=80,height=40)
Label(win_login,text='班级',font = ('微软雅黑'),justify=RIGHT,width=80).place(x=190,y=80,width=80,height=40)
Label(win_login,text='学号',font = ('微软雅黑'),justify=RIGHT,width=80).place(x=190,y=120,width=80,height=40)


#使用cursor()方法获取操作游标
cursor = db.cursor()
# 创建字符串变量和文本框组件,同时设置关联的变量
# 用户名
user = StringVar(win_login,value='')
entry_user = Entry(win_login,width=80,textvariable=user)
entry_user.place(x=310,y=50,width=80,height=40)

# 班级
cla = StringVar(win_login,value='')
entry_cla = Entry(win_login,width=80,textvariable=cla)
entry_cla.place(x=310,y=80,width=80,height=40)

# 学号
passwd = StringVar(win_login,value='')
entry_passwd = Entry(win_login,show='*',width=80,textvariable=passwd)
entry_passwd.place(x=310,y=110,width=80,height=40)

# 按钮
Button(win_login,text='登录',font = ('微软雅黑'),command=login).place(x=150,y=200,width=80,height=50)
Button(win_login,text='注册',font = ('微软雅黑'),command=register).place(x=260,y=200,width=80,height=50)
Button(win_login,text='取消',font = ('微软雅黑'),command=cancel).place(x=370,y=200,width=80,height=50)

# 启动消息循环
win_login.mainloop()

运行结果:

GUI界面:

 注册成功页面:

 Navicate 表中的显示:

我遇到的问题:

1、Python 缩进问题

TabError: inconsistent use of tabs and spaces in indentation


问题:用了制表符做了python的缩进

原因:python的缩进是4个空格算一个缩进,如果不是4个空格就会有问题。

正确的缩进我们选中是分格的,一共4个空格,如果1个的话应该就是tab符了。

解决方法:(自创)[假设你和我一样,用的都是Spyder]

首先:勾上Show blank spaces,这样你就能看到制表符的缩进情况是"······"还是"-> ->"

然后:根据上下文,看出前后篇幅中统一的缩进符,直接复制粘贴“->”或"······"

 NICE!

 NICE!

 NICE!

相关知识:

1、MySQL 的字符集

MySQL 有以下字符集:client 、connection、database、results、server 、system。其中与服务器端相关:database、server、system(永远无法修改,就是utf-8);与客户端相关:connection、client、results 。

client 为客户端使用的字符集。

connection 为连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型则按照服务器端默认的字符集设置。

database 为数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。

results 为数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。

server 为服务器安装时指定的默认字符集设定。

system 为数据库系统使用的字符集设定。

2、 GUI 界面编程

wx.App、wx.Frame框架、常用控件(StaticText文本类、TextCtrl输入文本、Button按钮类)、事件处理之绑定事件

 

详见:https://blog.csdn.net/zha6476003/article/details/82938015

其他:

1、程序背景

在工作中经常会遇到需要将数据存储至数据库,而采用navicat的导入功能,在面对较大的数据时经常导入失败,即使导入成功,MySQL建表时一般默认使用该数据类型的最大值,比如varchar(225),如果我们的原始数据既有数值、文本又有时间,如果navicat不能识别其数据类型,均将其默认设置为varchar,这并非我们所期望的。所以,为了更高效的将数据存储至数据库,我写了如上程序。还请多多指教!

励志格言:

路漫漫其修远兮,吾将上下而求索。

相关