目录
- 1 效果图
- 2 环境准备
- 2.1 软件
- 2.2 pycharm+pyqt5环境搭建
- 3 开始写了
- 3.1 画个界面
- 3.2 把画的界面转为py
- 3.2 写逻辑咯
- 3.2.1 先看一眼界面什么样
- 3.2.2 补上需求分析
- 3.2.3 抽出些方法来
- 3.2.4 基础知识
- 3.2.4.1 事件监听
- 3.2.4.2 获取界面输入
- 3.2.4.3 给界面控件赋值
- 3.2.4.4 我想要跟用我的软件的人说句话
- 3.2.4.5 其他小知识
- 3.2.4.6 操作mysql数据库
- 3.2.4.7 打包为exe
- 4 本工程源码
- 5 优化
- 5.1 添加输入限制
- 5.2 添加分支流程
1 效果图
2 环境准备
2.1 软件
python:3.7.3
pyqt5
pycharm
2.2 pycharm+pyqt5环境搭建
首先安装 pyqt5 pyqt5-tools
pip install pyqt5
pip install pyqt5-tools
pycharm中添加qtdesigner、pyuic
file–settings–tools–external tools中添加 qtdesigner、pyuic
qtdesigner配置如下:
Program: D:\Python37\Scripts\designer.exe
Working directory: $FileDir$
pyuic配置如下:
Program:D:\Python37\python.exe
Arguments:-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py
Working directory:$FileDir$
配置完成后,pycharm中打开qtdesigner验证下是否成功了
点击 toos–external tools – qtdesigner,弹出 qt designer工具即可
3 开始写了
3.1 画个界面
首先建个工程(废话),打开 qt designer,画个界面,如下:
具体怎么画,百度下或者有空补充下吧
画完了,保存下,保存到工程根目录即可,文件名:GMTools.ui
3.2 把画的界面转为py
这就用到我们之前加的 pyuic了
pycharm中右键GMTools.ui,找到 pyuic,点击即可生成一个 GMTools.py
注意哦:
我们在coding过程中会觉得界面不对,需要修改的时候,直接在designer中修改保存后,回来pyuic一下即可
所以,不要在生成的GMTools.py 中编写任何东西,逻辑代码新建个文件写
3.2 写逻辑咯
3.2.1 先看一眼界面什么样
新建一个 GMToolsMain.py,我们的主逻辑就在这个文件里实现了
这个文件的基础框架是这样的
# coding=utf-8
import GMTools
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtWidgets import *
if __name__ == '__main__':
# 初始化数据
# 。。。。。
app = QApplication(sys.argv)
MainWindow = QMainWindow()
ui = GMTools.Ui_mainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
# 设置默认数据
ui.lineEdit.setText('127.0.0.1')
ui.lineEdit_2.setText('3306')
ui.lineEdit_3.setText('root')
ui.lineEdit_4.setText('1234')
# 事件监听
# 。。。。。
sys.exit(app.exec_())
我们来试一下,运行下 GMToolsMain.py,你会看到这个界面
3.2.2 补上需求分析
接下来就是实现 界面上的按钮功能了,我们捋一下都有哪些功能
- 连接数据库、断开数据库连接
- 获取玩家列表
- 选择一个玩家
- 获取 基础信息、兵器信息、武将信息
- 修改 基础信息
- 修改 兵器信息
- 修改 武将信息
- 送个真屠龙套装
- 送个顶级晶石
嗯~~~ 差不多这些吧
3.2.3 抽出些方法来
针对上边这些功能,我们大概需要写这么几个方法
- connectDB()
- disconnectDB()
- getPlayerList()
- getPlayerData()
- modifyWeapon()
- modifyGeneral()
- sendTulong()
- sendJingshi()
差不多这些吧~~~
看下代码结构:
3.2.4 基础知识
3.2.4.1 事件监听
截止到上一步,我们已经把架子搭完了,但是逻辑怎么跟界面关联呢???
比如,点击了“连接数据库”按钮,怎么去调用connectDB方法??
这就用到了 事件监听(姑且叫这个名字吧,这好像是pygame的叫法。。。意思是一样的~)
我们先来个简单的,如下:
def clickedButton():
print("你点击了按钮")
if __name__ == '__main__':
app = QApplication(sys.argv)
MainWindow = QMainWindow()
ui = GMTools.Ui_mainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
# 事件监听
# 监听连接数据库按钮
ui.Button_connectDB.clicked.connect(clickedButton)
sys.exit(app.exec_())
如上,就实现了点击界面的 Button_connectDB 按钮,后台打印 “你点击了按钮”
3.2.4.2 获取界面输入
可以看到我们界面上控件有 按钮、下拉框、输入框
获取这些空间的文本,如下:
# 获取输入框内容
t1 = ui.lineEdit.text()
# 获取下拉框当前选中的项
t2 = ui.comboBox.currentText()
# 获取按钮的内容
ui.Button_connectDB.text()
这时候,有人会问:为什么要获取按钮的内容呢?
其实按钮内容可以变得,比如:数据库未连接时按钮显示"连接数据库",已连接时显示"断开连接"
那么问题来了:怎么改变按钮显示的内容呢???
3.2.4.3 给界面控件赋值
接上节问题:怎么改变按钮显示的内容呢???
# 把按钮内容改为断开连接
ui.Button_connectDB.setText('断开连接')
# 把输入框内容改为 123
ui.lineEdit.setText('123')
# 给下拉框赋一组数据
general_list = ['将军1', '将军2', '将军3', '将军4', '将军5', '将军6', '将军7', '将军8', '将军9', '玩游人生亲测', '玩游人生淘宝']
ui.comboBox.addItems(general_list)
# 把下拉框指定选中第3个,从0开始数哦
ui.comboBox.setCurrentIndex(3)
注意:setText方法只能set字符串!!!
3.2.4.4 我想要跟用我的软件的人说句话
之前我们说的都是一些”默默无闻“的东西,我想实时的跟人互动怎么办?
比如:点击了一个按钮,弹出一个提示框
还是用连接数据库按钮来展示,我们只需要改下clickedButton方法即可,如下
def clickedButton():
# print("你点击了按钮")
# 提示 终于碰到你,还好我没放弃
QMessageBox.information(MainWindow, '提示信息', '终于碰到你,还好我没放弃', QMessageBox.Ok)
if __name__ == '__main__':
app = QApplication(sys.argv)
MainWindow = QMainWindow()
ui = GMTools.Ui_mainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
# 事件监听
# 监听连接数据库按钮
ui.Button_connectDB.clicked.connect(clickedButton)
sys.exit(app.exec_())
来试一下,看看效果:
在最美好的年纪遇到你。。。。
3.2.4.5 其他小知识
毕竟是做一个工具,要给别人用的(可能并没有人用。。。),我们要做一些必要的限制
比如武将名称那个输入框是不能修改的
ui.lineEdit_j1.setEnabled(False)
断开数据库后,需要清空输入框中的信息
ui.lineEdit_j1.clear()
ui.comboBox.clear()
3.2.4.6 操作mysql数据库
基本关于pyqt相关的基础知识已经差不多了(本项目中用到的),接下来我们要操作数据库(毕竟GM工具就是用来改数据的)
操作mysql数据库用到了pymysql,先pip安装之
pip install pymysql
基本使用,直接上代码
import pymysql
# 连接数据库
conn = pymysql.connect(
host=ip,
port=port,
user=user,
password=pwd,
database='gcld',
charset='utf8')
# 取到游标(好像是叫这个词)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 执行sql
cursor.execute("select player_id, player_name from player;")
# 获取查询结果,如果执行的是insert 或者 update 就不能这么用了
res = cursor.fetchall()
返回一个list,样式如下:
[{'player_id': 1, 'player_name': '将军1'}, {'player_id': 2, 'player_name': '将军2'}, {'player_id': 3, 'player_name': '将军3'}, {'player_id': 4, 'player_name': '将军4'}, {'player_id': 5, 'player_name': '将军5'}, {'player_id': 6, 'player_name': '将军6'}, {'player_id': 7, 'player_name': '将军7'}, {'player_id': 8, 'player_name': '将军8'}, {'player_id': 9, 'player_name': '将军9'}, {'player_id': 11, 'player_name': '亲测'}, {'player_id': 10, 'player_name': '人生'}]
3.2.4.7 打包为exe
5 优化
5.1 添加输入限制
pyqt5 有个类叫 QRegExpValidator,正则表达式验证器
使用如下:
# 定义等级验证器 1到200的整数
lv_validator = QRegExpValidator()
lv_reg = QRegExp("0|200|1{0,1}[1-9]{1,2}")
lv_validator.setRegExp(lv_reg)
# 玩家等级加验证
ui.lineEdit_lv.setValidator(lv_validator)
嗯,正则~ 显得有点高大上了,再也不怕乱填了