使用PyQt5写一个桌面程序
目录
- 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
看另一篇文章 pyinstaller打包python程序为exe
================================
至此,所有的技术点就完事了,努力coding吧少年
4 本工程源码
git仓库:https://github.com/suheping/gcld_gm
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)
嗯,正则~ 显得有点高大上了,再也不怕乱填了
5.2 添加分支流程
没有连数据库的时候,直接点了修改怎么办??
没有选定玩家的时候,直接点了修改怎么办??
愁人~~~
加判断吧
使用PyQt5写一个桌面程序相关推荐
- js桌面应用 Linux,从 1 到完美,用 js 和 electron 写一个桌面应用
从 1 到完美,用 js 和 electron 写一个桌面应用 目前用 js 和前端技术写桌面软件的方案主要有两种:electron 和 nw.js.这两者在底层实现上有所不同,简单的说,electr ...
- 学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装
在这一系列的前一篇文章学了C语言,如何为下载狂人写一个磁盘剩余容量监控程序?中,我们为下载狂人写了一个程序来监视磁盘的剩余容量,防止下载的东西撑爆了硬盘.可是,这两天,他又抱怨他的下载程序不好用,让我 ...
- 控制台编写JAVA程序教程_写一个java程序的步骤是什么?写java程序技巧
写Java程序是要按照步骤来的,这样才能写好一个java程序,那么接下来,我们就来给大家讲解一下写一个java程序的步骤是什么? (1)创建Java项目:"FileàNewàProjectà ...
- linux如何写一个daemon程序
linux如何写一个daemon程序 http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html 不过现在linux直接提供了api实现 ...
- 用python3+ PyQt5写一个NFC模块的串口小工具的一星期
用python3+ PyQt5写一个NFC模块的串口小工具的一星期 原因始于我们的小团队,没有写Windows上位机的人才.自己的[NFC读读写模](https://shop165836966.tao ...
- [WinForm]写一个小程序把指定目录的程序添加到开机自动启动(无法绕过360检查)
网友阿东提示了这样一个需求:写一个小程序把指定目录的程序添加到开机自动启动,跳过360 我就到百度上搜了一下:C# 将程序添加到启动项 (写入注册表),及从启动项中删除 - 赤狐(zcm123) - ...
- 从0开始写一个小程序
项目简介 从0开始写一个小程序,本来想写一个新闻类的程序,后来发现调用的聚合数据api每天只能访问100次,就换成豆瓣的了,直接用豆瓣的接口又访问不了,在网上查了一下,要把豆瓣的地址换成"h ...
- 彩票中奖java程序 随机30选7_写一个彩票程序:30选7
1. 写一个彩票程序:30选7.随机(1~30之间)生成7个随机数,注意不能重复.然后从键盘输入7个数,对比7个数是否与随机数有相同的.最后显示"中了几个号".同时,如果中了7个号 ...
- 用python写一个小程序,解决买水果的问题?
问题: 商店总共有三种水果,香蕉/苹果/葡萄,单价分别为3.5/5.0/3.0元/500克. 写一个小程序实现: 1.输出一个菜单:打印每种水果的价格: 2.寻问客户欲购买水果? 3.客户想购买的克数 ...
最新文章
- Hyper-V 性能加速之VMQ
- fasttext简单理解及应用
- ARSessionConfiguration报错问题
- wxWidgets:wxMenuItem类用法
- SQL 进行数据的更新和插入
- leetcode50:Pow(x, n)详解——pygo
- 一次kvm嵌套虚拟化踩坑经历
- Docker系列二~自定义网桥
- js+css实现验证码框,前端实现6位验证码输入框效果
- 苹果下周将推出紫色版iPhone 13 但只有高端版本
- mysql /!/_Mysql(一)
- 181016扇贝有道词霸每日一句
- python遍历目录下所有文件
- Tkinter实现模拟鼠标单击四位数字验证码自动刷新功能
- Word 中文编号标题与数字编号题注
- H5安卓下载以及IOS跳转AppStore下载App
- 【linux内核分析与应用-陈莉君】设备驱动模型
- Ae:导入 Photoshop 文件
- “幽灵刹车”困扰特斯拉
- 硕士论文各章节的篇幅多少比较合适
热门文章
- hadoop框架中怎么来优化
- 什么人不在生死簿_人在做, 天在看, 阎王爷“生死簿”上到底写了什么!
- springboot中JJWT的简单使用
- “百亿资金盘”PlusToken崩盘前,用户每天充值信仰
- 路由追踪命令:tracert、pathping!值得收藏!
- 如何“以输出倒逼输入”加速自己成长?
- VScode配置ffmpeg+sdl2.0开发环境(window+MinGW)
- CentOS 7 安装NFS
- 人脸识别-人脸建库学习:Sqlite3 的基本使用
- es5 和es6的区别