【PYQT】制作可以显示图片的抽卡模拟器


更新

这个帖子是我刚学不久发的,做的非常粗糙,时间太久了,我也记不清怎么搞的了,考研复习重做一下放松一下(花了一下午)。我根据赛马娘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
在这里插入图片描述


总结

以上就是分享的内容,也是自我学习的记录,很多还在摸索中,请多指教~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值