文章目录
更新
这个帖子是我刚学不久发的,做的非常粗糙,时间太久了,我也记不清怎么搞的了,考研复习重做一下放松一下(花了一下午)。我根据赛马娘Bwiki的模拟抽卡界面重新画了界面,功能也更符合正常的抽卡需求,至少我这帖子是没搞清需求。。。
这个帖子的内容没有什么参考性了,更完整版的代码我也上传了github,请移步【PYQT】赛马娘抽卡模拟器-基于Bwiki的抽卡模拟(上)查看更新后的内容。
Github源码:DrawCard_uma
前言
记录自己学习pyqt制作抽卡模拟器(简易)的过程。
抽卡规则基于赛马娘。
实现了一连抽和十连抽的功能,保底功能,十连抽必出sr功能,抽出ssr显示图片功能,
以及货币不足提示功能
一、前置操作
默认安装好了qt designer以及和python的环境配置:
需要安装的python包:
pyqt5
如若需要打包成exe文件(不推荐)
则需要安装pyinstaller包
本人是通过vscode编写py文件的,预先安装了插件:PYQT Integration,便于转换ui文件为py文件,以及快捷的打开qt designer编辑窗体。
不过,不使用vscode,通过控制台代码转换ui文件也是可行的。
二、操作步骤
1.qt绘制模拟器界面并转换为py文件
qt designer的基本使用方法可以参考这里:
https://www.cnblogs.com/linyfeng/p/11223707.html
个人简单绘画了一个界面
注意需要对每个控件重命名,方便之后在程序中调用。(不改名无法调用,同时也不好分辨)
下面是我本人对控件的命名
其中涉及了用标签显示图片,有两个标签控件因为是空白未在上图显示
自定义界面后保存,得到一个ui后缀的文件
用vscode打开刚才保存位置的文件夹,右键文件“PYQT:Compile Form”转换为py文件。
如果转换出现问题,可以尝试在vscode里点击“文件->首选项->设置”,搜索pyqt,设置插件。
我的设置如下
第一个框为你的pyuic.5文件的位置,如果python不是用的anaconda则需要自己找到文件位置填入
第二个框“-x”表示转换后的py文件自带把窗体显示出来的函数,不用手动输入
第三个框默认为此
第四个框为你qt designer的位置,需要自己编辑
2.在项目文件夹加入数据文件
新建一个txt文件填入卡池内容
本人新建了一个data.txt文件,随便填写数据即可,本人设置了42行数据,对应代码中数组的大小。
注意要修改txt文本的编码为ANSI,否则读取会出问题。
同时放入抽出ssr卡需要显示的图片,并重命名方便在代码中调用。
3.新建一个py文件进行操作界面
新建一个py文件和ui转换后的py文件分开,可以方便修改方法和修改界面,不容易产生冲突。
如果需要修改界面,把修改后的ui文件再转换为py文件覆盖先前的即可。不会影响到操作函数。
新建文件命名为:“抽卡启动器”。
代码如下
添加信号和槽用函数连接刚才界面中创建的按钮“一抽”和“十连”
import sys
import random
#PyQt5中使用的基本控件
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtWidgets import QMessageBox
from PyQt5 import QtGui
#导入designer工具
from Ui_抽卡系统 import*
class MyMainForm(QMainWindow, Ui_Form):
def __init__(self, parent=None):
super(MyMainForm, self).__init__(parent)
self.setupUi(self)
#修饰界面
self.setWindowTitle("抽卡模拟器")
#添加信号和槽。
self.getone.clicked.connect(self.one)
self.getten.clicked.connect(self.ten)
之后定义one和ten两个函数就可以用按钮实现定义的功能。
定义one函数,即“一抽”对应按钮的函数
def one(self):
name=self.textname.text() #读取用户名
a = self.textmoney.text() #读取货币数量
if(name==""):
QMessageBox.critical(self, "错误", "请输入用户名", QMessageBox.Yes | QMessageBox.Yes) #判断名字不为空
elif(a==""):
QMessageBox.critical(self, "错误", "请输入货币数量", QMessageBox.Yes | QMessageBox.Yes) #判断货币不为空
elif(int(a)<150):
self.result.setText("货币不足~")
QMessageBox.critical(self, "错误", "货币不足", QMessageBox.Yes | QMessageBox.No)
elif(int(a)>=150):
data = []
for line in open("data.txt","r"): #设置文件对象并读取每一行文件
data.append(line) #将每一行文件加入到list中
text=data[random.randint(0,41)]
#改变保底次数
countnum=self.count.text()
if(int(countnum)-1>0):
self.count.setText(str(int(countnum)-1))
else:
self.count.setText("100")
text="SSR:【北部玄驹】"
#设置SSR卡牌
ssr1="SSR:【北部玄驹】"
ssr2="SSR:【里见光钻】"
if(text==ssr1 ):
jpg = QtGui.QPixmap("北黑").scaled(self.card.width(), self.card.height())
self.card.setPixmap(jpg)
self.ssrtext.setText("恭喜您抽到的SSR卡为:"+'\n'+"北部玄驹")
elif(text==ssr2):
jpg = QtGui.QPixmap("光钻").scaled(self.card.width(), self.card.height())
self.card.setPixmap(jpg)
self.ssrtext.setText("恭喜您抽到的SSR卡为:"+'\n'+"里见光钻")
else:
self.ssrtext.setText("很遗憾您未抽到SSR卡")
self.card.setText("")
#执行抽卡
self.result.setText(text)
b=int(a)-150
self.textmoney.setText(str(b)) #一抽减少150货币。转换为字符型填入money
定义 ten函数,即“十连”对应的按钮。
此函数相较于one本质意思是一样的不过进行了一些优化,方便阅读一些。
def ten(self):
name=self.textname.text() #读取用户名
a = self.textmoney.text() #读取货币数量
data = []
for line in open("C:\Qt\项目\抽卡系统\data.txt","r"): #设置文件对象并读取每一行文件
data.append(line) #将每一行文件加入到list中
Text="" #设置最终输出文本
for i in range(9):
text=data[random.randint(0,41)]
Text=Text+text
sr=data[random.randint(25,39)]
Text=Text+sr
if(name==""):
QMessageBox.critical(self, "错误", "请输入用户名", QMessageBox.Yes | QMessageBox.Yes) #判断名字不为空
elif(a==""):
QMessageBox.critical(self, "错误", "请输入货币数量", QMessageBox.Yes | QMessageBox.Yes) #判断货币不为空
elif(int(a)<1500):
self.result.setText("货币不足~")
QMessageBox.critical(self, "错误", "货币不足", QMessageBox.Yes | QMessageBox.No)
elif(int(a)>=1500):
self.result.setText(Text)
b=int(a)-1500
self.textmoney.setText(str(b)) #一抽减少1500货币。转换为字符型填入money
#改变保底次数
countnum=self.count.text()
if(int(countnum)-10>0):
self.count.setText(str(int(countnum)-10))
else:
self.count.setText("100")
Text=Text+'\n'+"SSR:【北部玄驹】"
#设置SSR卡牌
ssr1="SSR:【北部玄驹】"
ssr2="SSR:【里见光钻】"
if(ssr1 in Text ):
jpg = QtGui.QPixmap("北黑").scaled(self.card.width(), self.card.height())
self.card.setPixmap(jpg)
self.ssrtext.setText("恭喜您抽到的SSR卡为:"+'\n'+"北部玄驹")
elif(ssr2 in Text):
jpg = QtGui.QPixmap("光钻").scaled(self.card.width(), self.card.height())
self.card.setPixmap(jpg)
self.ssrtext.setText("恭喜您抽到的SSR卡为:"+'\n'+"里见光钻")
else:
self.ssrtext.setText("很遗憾您未抽到SSR卡")
self.card.setText("")
随后加上显示界面的代码就完成了
if __name__ == "__main__":
#固定语句。sys.argv是命令行参数列表,确保程序可以双击运行
app = QApplication(sys.argv)
#初始化
myWin = MyMainForm()
#将窗口控件显示在屏幕上
myWin.show()
#程序运行,sys.exit方法确保程序完整退出。
sys.exit(app.exec_())
如果在编码中报错,模块导入失败,可以在项目文件下新建一个.pylintrc文件,并且填入一下文字
把pyqt5加入白名单。
三.测试程序
在文件夹中双击“抽卡启动器.py”运行模拟器。
不输入货币数,出弹窗报错
货币不足弹窗
普通的一抽
十连抽到ssr
总结
以上就是分享的内容,也是自我学习的记录,很多还在摸索中,请多指教~