项目展示

https://www.zhihu.com/video/1236396757862100992

前言

潜水了大约半个月,这半个月实在抽不出时间来写一下博客,因为最近确实有点忙,不仅在练习微信小程序,有空还接了一下一些人的程序设计,虽然很多都是小打小闹,但是也给了我很多的乐趣,说到底的还真是面相¥编程,有了目标驱动,动力就足,干啥啥都有劲,以至于现在停下来感觉都快半身不遂了。编程快虽乐,还是要谨慎而行啊!

接下来这几天有空的话我分享一下这几个星期的积累,也算是经验分享,比如下面上线的这个微信小程序,用python做后台以及前端用vant做框架,还有一些小游戏,小系统,总的来说每一个都可以是一个简单的课程或者毕业小设计。

项目来源

好奇心驱使,最近接了个小设计,一个类似小游戏的东西,大概意思就是两个人分别点击两张图片,如果图片相同,则该玩家加一分,继续翻,如果不相同,则换下一个玩家。

一开始没有什么思路,想着游戏应该用pygame来做,但是鄙人对pygame不熟悉,所以放弃了,后面脑子想了一下用tkinter来做行不行,试了下太复杂了,又pass,最后想到还有个pyqt没玩过,为什么不试试呢?二话不想开始装库,这过程就不赘述了,CSDN上有一堆教程,还有界面设计designer的使用,也不多赘述,网上有教程,我放出来给大家了,由于一开始我参考的那两篇博客不知道是哪个了,我这边就说一下我踩的坑。

由于pyqt有点大,所以我们换成国内源安装,我当时用的是豆瓣,嗖嗖嗖的就下完了

pip install PyQt5 -i https://pypi.doubanio.com/simple

pip install pyqt5-tools -i https://pypi.doubanio.com/simple

后面这个就是designer的安装,安装好后在你安装的包的路径就能找到,我用的是瓦坎达,库一般安装在Anaconda3Libsite-packages下,然后找到pyqt5-tools文件夹,进去就能找到designer了,没有就用搜索搜一下designer.exe

pip install pyqt5-tools -i https://pypi.doubanio.com/simple
打开后就是这样的界面,当然你们的应该是创建界面,我这个是我这个项目已经设计好的页面,至于为啥我的是中文,网上也有教程,不赘述,找百度。(说句悄悄话,英语太差,没办法。不过pyqt确实比tkinter好用,能拖拉设计。。。。)

设计完后找到你的.ui文件导出成py文件,命令就是下面这行,注意要进入到存放ui文件的目录,或者你直接加个绝对路径。

pyuic5 -o name.py name.ui

最后代码

# %%writefile game.py
from PyQt5.QtWidgets import QApplication, QMainWindow,QGridLayout
from PyQt5 import QtCore, QtGui, QtWidgets, QtMultimedia
from PyQt5.QtCore import QUrl, Qt
import sys
import os,random,win32api,win32con
global a
a=[]
for root, dirs, files in os.walk('./img'):   a=files*2 #当前路径下所有非目录子文件
global b
b=''
global d
d=["1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16"]
global count,play_1,play_2
count=0
play_1=0
play_2=0
class Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(1047, 813)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.pushButton_1 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_1.setGeometry(QtCore.QRect(20, 10, 191, 161))self.pushButton_1.setObjectName("pushButton")self.pushButton_1.setStyleSheet("QPushButton{border-image: url(mr/1.jpg)}")self.pushButton_1.clicked.connect(lambda:self.setimg("1"))self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_2.setGeometry(QtCore.QRect(830, 10, 191, 161))self.pushButton_2.setObjectName("pushButton_2")self.pushButton_2.setStyleSheet("QPushButton{border-image: url(mr/1.jpg)}")self.pushButton_2.clicked.connect(lambda:self.setimg("2"))self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_3.setGeometry(QtCore.QRect(570, 10, 191, 161))self.pushButton_3.setObjectName("pushButton_3")self.pushButton_3.setStyleSheet("QPushButton{border-image: url(mr/1.jpg)}")self.pushButton_3.clicked.connect(lambda:self.setimg("3"))self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_4.setGeometry(QtCore.QRect(290, 10, 191, 161))self.pushButton_4.setObjectName("pushButton_4")self.pushButton_4.setStyleSheet("QPushButton{border-image: url(mr/1.jpg)}")self.pushButton_4.clicked.connect(lambda:self.setimg("4"))self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_5.setGeometry(QtCore.QRect(20, 190, 191, 161))self.pushButton_5.setObjectName("pushButton_5")self.pushButton_5.setStyleSheet("QPushButton{border-image: url(mr/1.jpg)}")self.pushButton_5.clicked.connect(lambda:self.setimg("5"))self.pushButton_6 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_6.setGeometry(QtCore.QRect(830, 190, 191, 161))self.pushButton_6.setObjectName("pushButton_6")self.pushButton_6.setStyleSheet("QPushButton{border-image: url(mr/1.jpg)}")self.pushButton_6.clicked.connect(lambda:self.setimg("6"))self.pushButton_7 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_7.setGeometry(QtCore.QRect(570, 190, 191, 161))self.pushButton_7.setObjectName("pushButton_7")self.pushButton_7.setStyleSheet("QPushButton{border-image: url(mr/1.jpg)}")self.pushButton_7.clicked.connect(lambda:self.setimg("7"))self.pushButton_8 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_8.setGeometry(QtCore.QRect(290, 190, 191, 161))self.pushButton_8.setObjectName("pushButton_8")self.pushButton_8.setStyleSheet("QPushButton{border-image: url(mr/1.jpg)}")self.pushButton_8.clicked.connect(lambda:self.setimg("8"))self.pushButton_9 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_9.setGeometry(QtCore.QRect(20, 370, 191, 161))self.pushButton_9.setObjectName("pushButton_9")self.pushButton_9.setStyleSheet("QPushButton{border-image: url(mr/1.jpg)}")self.pushButton_9.clicked.connect(lambda:self.setimg("9"))self.pushButton_10 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_10.setGeometry(QtCore.QRect(830, 370, 191, 161))self.pushButton_10.setObjectName("pushButton_10")self.pushButton_10.setStyleSheet("QPushButton{border-image: url(mr/1.jpg)}")self.pushButton_10.clicked.connect(lambda:self.setimg("10"))self.pushButton_11 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_11.setGeometry(QtCore.QRect(570, 370, 191, 161))self.pushButton_11.setObjectName("pushButton_11")self.pushButton_11.setStyleSheet("QPushButton{border-image: url(mr/1.jpg)}")self.pushButton_11.clicked.connect(lambda:self.setimg("11"))self.pushButton_12 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_12.setGeometry(QtCore.QRect(290, 370, 191, 161))self.pushButton_12.setObjectName("pushButton_12")self.pushButton_12.setStyleSheet("QPushButton{border-image: url(mr/1.jpg)}")self.pushButton_12.clicked.connect(lambda:self.setimg("12"))self.pushButton_13 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_13.setGeometry(QtCore.QRect(20, 560, 191, 161))self.pushButton_13.setObjectName("pushButton_13")self.pushButton_13.setStyleSheet("QPushButton{border-image: url(mr/1.jpg)}")self.pushButton_13.clicked.connect(lambda:self.setimg("13"))self.pushButton_14 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_14.setGeometry(QtCore.QRect(830, 560, 191, 161))self.pushButton_14.setObjectName("pushButton_14")self.pushButton_14.setStyleSheet("QPushButton{border-image: url(mr/1.jpg)}")self.pushButton_14.clicked.connect(lambda:self.setimg("14"))self.pushButton_15 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_15.setGeometry(QtCore.QRect(570, 560, 191, 161))self.pushButton_15.setObjectName("pushButton_15")self.pushButton_15.setStyleSheet("QPushButton{border-image: url(mr/1.jpg)}")self.pushButton_15.clicked.connect(lambda:self.setimg("15"))self.pushButton_16 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_16.setGeometry(QtCore.QRect(290, 560, 191, 161))self.pushButton_16.setObjectName("pushButton_16")self.pushButton_16.setStyleSheet("QPushButton{border-image: url(mr/1.jpg)}")self.pushButton_16.clicked.connect(lambda:self.setimg("16"))self.pushButton_17 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_17.setGeometry(QtCore.QRect(600, 750, 101, 41))self.pushButton_17.setObjectName("pushButton_17")self.pushButton_17.clicked.connect(self.stop)self.pushButton_18 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_18.setGeometry(QtCore.QRect(470, 750, 101, 41))self.pushButton_18.setObjectName("pushButton_18")self.pushButton_18.clicked.connect(self.pause)self.pushButton_19 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_19.setGeometry(QtCore.QRect(350, 750, 101, 41))self.pushButton_19.setObjectName("pushButton_19")self.pushButton_19.clicked.connect(self.play)url = QUrl.fromLocalFile(r"1.mp3")content = QtMultimedia.QMediaContent(url)self.player = QtMultimedia.QMediaPlayer()self.player.setMedia(content)MainWindow.setCentralWidget(self.centralwidget)self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)def stop(self):self.player.stop()def play(self):self.player.play()def pause(self):self.player.pause()def setimg(self,name):global a,b,d,count,play_1,play_2if a==[]:win32api.MessageBox(0,'游戏结束啦!n玩家一得分:%s,玩家二得分:%s'%(play_1,play_2),"提醒",win32con.MB_ICONWARNING)else:if name in d:count+=1d.remove(name)buttonname="self.pushButton_%s"%namebuttonname=eval(buttonname)if b=='':b=random.choice(a)a.remove(b)buttonname.setStyleSheet("QPushButton{border-image: url(img/%s)}"%b)else:c=random.choice(a)a.remove(c)buttonname.setStyleSheet("QPushButton{border-image: url(img/%s)}"%c)if c==b:if str(count) in ["2","6","10","14"]:play_1+=1win32api.MessageBox(0, "恭喜你选对了!可以继续游戏。n当前玩家一得分:%s,玩家二得分:%s"%(play_1,play_2), "提醒",win32con.MB_OK)b=''else:play_2+=1win32api.MessageBox(0, "恭喜你选对了!可以继续游戏。n当前玩家一得分:%s,玩家二得分:%s"%(play_1,play_2), "提醒",win32con.MB_OK)b=''else:win32api.MessageBox(0,'很遗憾你没选对!下一位玩家', "提醒",win32con.MB_ICONWARNING)b=''else:win32api.MessageBox(0,'你已经点过该图了!', "提醒",win32con.MB_ICONWARNING)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "点图大战"))self.player.play()self.pushButton_17.setText(_translate("MainWindow", "停止播放音乐"))self.pushButton_18.setText(_translate("MainWindow", "暂停播放音乐"))self.pushButton_19.setText(_translate("MainWindow", "继续播放音乐"))if __name__ == '__main__':app = QApplication(sys.argv)MainWindow = QMainWindow()ui = Ui_MainWindow()ui.setupUi(MainWindow)MainWindow.show()sys.exit(app.exec_())
class Ui_MainWindow这个类就是你导出成py文件后他自动给你生成的, 我们需要下面这个调用它,俗称搞对象。if __name__ == '__main__':app = QApplication(sys.argv)MainWindow = QMainWindow()ui = Ui_MainWindow()ui.setupUi(MainWindow)MainWindow.show()sys.exit(app.exec_())

class Ui_MainWindow这个类就是你导出成py文件后他自动给你生成的, 我需要下面这个调用它,俗称搞对象。

     sys.exit(app.ec_())  

不出意外的话你就会得到下面这样的情况,没错,这就是你的对象,只有躯体,没有灵魂的!而我们真正要做的就是给他加上灵魂。

然后给每个按钮绑定一个事件----》》self.pushButton_1.clicked.connect(lambda:self.setimg("1")

最后加个背景音乐,完事。

self.player.setMedia(content) 

需要注意的是,起初我是想每个按钮绑定一个事件,后面发现太复杂,就想到全部按钮绑定到同一个事件,每次点击按钮时传入该按钮的编号,然后再将字符转换为变量---》》buttonname="self.pushButton_%s"%name buttonname=eval(buttonname),用来更换不同的背景图片,也就是给你的对象换衣服。

整体思路

设计好界面 给到一个默认按钮样式 创建文件夹保存更换按钮的8张图片(16个按钮,我们需要8张图,两两相同),创建图片列表,并将它2,变成16个图片名元素

随机选择列表内的一个元素赋值给b,然后图片b给到当前按钮,从图片列表删除b元素,因为一开始b是空的,当第二次点击的时候我们判断当前随机获取到的元素是否与b相同,不同则换人,同就继续,该玩家积分加一。

按钮列表,每点击一次移除一个,如果按钮列表内没有该按钮,说明该按钮已经点过了,给出提示。

结论

项目虽小,但是一开始并没有思路,当逻辑弄清楚后,我们再转为代码就容易多了,所以我们在做东西的时候应该先脑子里有个整体思路,不然会白白浪费大把时间,写出的东西还一团糟。

pyqt创建窗口没有句柄_史上最强之《Pyqt》写游戏相关推荐

  1. dos命令窗口光标闪烁_史上最全的Vim命令(二)

    8. 排版 8.1 基本排版 << 向左缩进一个shiftwidth >> 向右缩进一个shiftwidth :ce(nter) 本行文字居中 :le(ft) 本行文字靠左 : ...

  2. pyqt创建窗口没有句柄_Filament 渲染引擎剖析 之 FrameGraph 1 虚拟资源的定义与创建...

    Filament 使用了可扩展渲染管线(FrameGraph)来组织渲染通道和管理渲染资源,网上也搜了下可扩展渲染管线的相关的文章,一般认为可扩展渲染管线是次时代渲染引擎应该具备的比较先进的管线组织架 ...

  3. pyqt创建窗口没有句柄_Word中如何创建自定义样式与应用样式

    在 Word 2016 中,除可选用现成的样式外,还可以自定义样式,即创建样式.自定义的样式能保存到样式库,使用的时候像选择 Word 提供的样式一样.例如:自己制作出十分漂亮的样式并且常常要用这样的 ...

  4. pyqt创建窗口没有句柄_Python GUI之Tkinter窗口视窗教程集合

    一.前言 由于本篇文章较长,所以如有部分是了解过的可直接跳过. 二.Tkinter是什么 Tkinter 是使用 python 进行窗口视窗设计的模块.Tkinter模块("Tk 接口&qu ...

  5. android名字最长,AaaaaAAaaa...体验史上名字最长的游戏

    你见过最长的游戏名称有多长呢?AaaaaAAaaaAAAaaAAAAaAAAAA!!!告诉你可以有这么长,先不管它是一款什么类型的游戏,单看这一长串的字母就足够把人吓一跳,绝对可以称之为拥有史上最长名 ...

  6. 最难游戏2计算机,《只狼:影逝二度》勉强排第六?盘点10款史上最难的单机游戏!...

    原标题:<只狼:影逝二度>勉强排第六?盘点10款史上最难的单机游戏! 最近有部分玩家在微博和大表哥吐槽,<只狼:影逝二度>也太难了!手残党表示要被劝退了--其实论游戏难度,&l ...

  7. vscode win10笔记本 蓝屏_史上最详细的win10蓝屏错误代码大全详解

    [文章导读] 蓝屏是操作系统为了保护硬件而产生的蓝屏,但蓝屏代码有上百种,有些网友对于蓝屏代码比较头疼,下面小编给大家分享史上最全的蓝屏代码大全. 蓝屏是操作系统为了保护硬件而产生的蓝屏,但蓝屏代码有 ...

  8. java spring框架 注解_史上最全的java spring注解

    史上最全的java spring注解,没有之一 注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好.不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就 ...

  9. python 完全面向对象_史上最全的Python面向对象知识点疏理

    原标题:史上最全的Python面向对象知识点疏理 面向对象技术简介 类: 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例.class 类变量:类变 ...

最新文章

  1. 申报成功后怎样修改_【小白教程】12月第3期《申报成功后,如何更正,快快收藏!》...
  2. rabbitmq消费固定个数消息_SpringBoot+RabbitMQ (保证消息100%投递成功并被消费)
  3. 以application/json 方式提交 然后用在php中读取原始数据流的方式获取 在json_encode...
  4. ABAP性能优化之正确使用”move” 语句
  5. 前端学习(2570):template和jsx的对比
  6. mysql 通过echo的方式写入数据库 中文乱码解决方案
  7. 博士面试被拒,只因第一学历非985、211...
  8. 深入php面向对象和模式
  9. 随题而学(二)多维数组转一维数组
  10. 13_新闻客户端界面搭建
  11. 零基础学python-Python入门教程完整版(懂中文就能学会)
  12. 安卓蓝牙bluetooth开发全解
  13. 单片机喇叭如何响出报警声音 C语言程序,单片机报警器声音产生的方法(报警声音)...
  14. JS思维导图类库:jsMind
  15. 分享PHP多功能在线工具箱网站源码,安装教程详解
  16. php 解压zip/rar
  17. 题解 SP4487 【GSS6 - Can you answer these queries VI】
  18. 使用INT4/INT类型替换INT8/BIGINT类型能够节省多少磁盘空间?
  19. EXCEL数据有效性的多级联动
  20. java 连接PLC 问题总结 Windows machine for DCOM access, so as to avoid such exceptions.  [0x00000005]

热门文章

  1. 【JavaSE】图书馆系统制作--JavaSE简易知识整合
  2. IE 浏览器中不能使remove删除节点的解决方法
  3. 微信小程序--视频播放器
  4. Swagger2生成在线接口文档并导出pdf文件
  5. Java api中文在线版
  6. 带上ES一起寻找理想的另一半
  7. RTP载荷H265(实战细节)
  8. java 时间戳 什么意思_java时间与时间戳
  9. 年后跳槽如何准备?(转)
  10. 听说你,对薪酬待遇不太满意 . . . .