pyqt+python之二进制生肖占卜

目录

一、引言

二、GUI界面设计

1.效果演示

2.相关提示

3.界面设计.py

三、主要程序详解

1.导入相关模块

2.初始化设置

3.组内判断

4.猜测过程

四、总程序代码


一、引言

在数字时代,传统文化与编程语言的碰撞总能迸发奇妙火花。本项目以PyQt+Python 为技术载体,将古老的十二生肖文化与二进制算法相结合,打造一款互动占卜工具。用户通过图形化界面判断,系统会将其自动转换为二进制代码并推算生肖。既是对数理思维的现代化诠释,也是对PyQt事件驱动模型与Python数据处理能力的趣味实践。

二、GUI界面设计

使用PyQt5进行界面的搭建,界面如下:

初始界面搭建采用极简风格。用户通过四次选择,在对应四个组别中分别判断是否存在自身属相,从而给出四个存在与否的答案,最终点击"猜!",即可弹出计算机所预测的属相。

1.效果演示

以属猴为例:第一组和第四组中均存在"猴",第二组和第三组中不存在"猴",则由第一组到第四组分别选择"存在"、"不存在"、"不存在"、"存在",最后程序通过这四次答案给出的结果同样是"猴",则猜测正确,其他生肖同理。

但当未选择选项时,或存在空白选项时,会有"有空余选项未选择!"的提示;当均选择"存在"或"不存在"时(当然也存在其他情况,后面进行详细解释),也会出现"请按照实际情况进行选择! "的提示(因为按照组别内容,确实不满足条件,肯定是用户有意选错)。

2.相关提示

**3.**界面设计.py

通过pyuic5产生的GUI界面代码UI_shengxiao.py如下:

python 复制代码
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'UI_shengxiao.ui'
#
# Created by: PyQt5 UI code generator 5.15.11
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.setEnabled(True)
        Form.resize(600, 420)
        Form.setMinimumSize(QtCore.QSize(600, 420))
        Form.setMaximumSize(QtCore.QSize(600, 420))
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/image1.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        Form.setWindowIcon(icon)
        self.label_5 = QtWidgets.QLabel(Form)
        self.label_5.setGeometry(QtCore.QRect(370, 10, 141, 31))
        font = QtGui.QFont()
        font.setFamily("Adobe Arabic")
        font.setPointSize(16)
        self.label_5.setFont(font)
        self.label_5.setObjectName("label_5")
        self.label_8 = QtWidgets.QLabel(Form)
        self.label_8.setGeometry(QtCore.QRect(190, 10, 131, 31))
        font = QtGui.QFont()
        font.setFamily("Adobe Arabic")
        font.setPointSize(18)
        font.setBold(False)
        font.setWeight(50)
        self.label_8.setFont(font)
        self.label_8.setObjectName("label_8")
        self.label_10 = QtWidgets.QLabel(Form)
        self.label_10.setGeometry(QtCore.QRect(450, 0, 71, 51))
        self.label_10.setText("")
        self.label_10.setPixmap(QtGui.QPixmap(":/image1.png"))
        self.label_10.setObjectName("label_10")
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(30, 80, 71, 31))
        font = QtGui.QFont()
        font.setFamily("Adobe Arabic")
        font.setPointSize(16)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.label_3 = QtWidgets.QLabel(Form)
        self.label_3.setGeometry(QtCore.QRect(140, 60, 351, 81))
        font = QtGui.QFont()
        font.setFamily("Adobe Arabic")
        font.setPointSize(36)
        self.label_3.setFont(font)
        self.label_3.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.label_3.setObjectName("label_3")
        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(30, 160, 71, 31))
        font = QtGui.QFont()
        font.setFamily("Adobe Arabic")
        font.setPointSize(16)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.label_4 = QtWidgets.QLabel(Form)
        self.label_4.setGeometry(QtCore.QRect(30, 240, 71, 31))
        font = QtGui.QFont()
        font.setFamily("Adobe Arabic")
        font.setPointSize(16)
        self.label_4.setFont(font)
        self.label_4.setObjectName("label_4")
        self.label_6 = QtWidgets.QLabel(Form)
        self.label_6.setGeometry(QtCore.QRect(30, 320, 71, 31))
        font = QtGui.QFont()
        font.setFamily("Adobe Arabic")
        font.setPointSize(16)
        self.label_6.setFont(font)
        self.label_6.setObjectName("label_6")
        self.label_7 = QtWidgets.QLabel(Form)
        self.label_7.setGeometry(QtCore.QRect(140, 140, 351, 81))
        font = QtGui.QFont()
        font.setFamily("Adobe Arabic")
        font.setPointSize(36)
        self.label_7.setFont(font)
        self.label_7.setObjectName("label_7")
        self.label_9 = QtWidgets.QLabel(Form)
        self.label_9.setGeometry(QtCore.QRect(140, 220, 351, 81))
        font = QtGui.QFont()
        font.setFamily("Adobe Arabic")
        font.setPointSize(36)
        self.label_9.setFont(font)
        self.label_9.setObjectName("label_9")
        self.label_11 = QtWidgets.QLabel(Form)
        self.label_11.setGeometry(QtCore.QRect(140, 300, 351, 81))
        font = QtGui.QFont()
        font.setFamily("Adobe Arabic")
        font.setPointSize(36)
        self.label_11.setFont(font)
        self.label_11.setObjectName("label_11")
        self.label_12 = QtWidgets.QLabel(Form)
        self.label_12.setGeometry(QtCore.QRect(20, 60, 481, 71))
        self.label_12.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.label_12.setText("")
        self.label_12.setObjectName("label_12")
        self.label_13 = QtWidgets.QLabel(Form)
        self.label_13.setGeometry(QtCore.QRect(20, 140, 481, 71))
        self.label_13.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.label_13.setText("")
        self.label_13.setObjectName("label_13")
        self.label_14 = QtWidgets.QLabel(Form)
        self.label_14.setGeometry(QtCore.QRect(20, 220, 481, 71))
        self.label_14.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.label_14.setText("")
        self.label_14.setObjectName("label_14")
        self.label_15 = QtWidgets.QLabel(Form)
        self.label_15.setGeometry(QtCore.QRect(20, 300, 481, 71))
        self.label_15.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.label_15.setText("")
        self.label_15.setObjectName("label_15")
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(140, 380, 331, 31))
        font = QtGui.QFont()
        font.setFamily("Adobe Arabic")
        font.setPointSize(12)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        self.radioButton = QtWidgets.QRadioButton(Form)
        self.radioButton.setGeometry(QtCore.QRect(520, 80, 89, 16))
        self.radioButton.setAutoExclusive(True)
        self.radioButton.setObjectName("radioButton")
        self.radioButton_2 = QtWidgets.QRadioButton(Form)
        self.radioButton_2.setGeometry(QtCore.QRect(520, 100, 89, 16))
        self.radioButton_2.setAutoExclusive(True)
        self.radioButton_2.setObjectName("radioButton_2")
        self.radioButton_3 = QtWidgets.QRadioButton(Form)
        self.radioButton_3.setGeometry(QtCore.QRect(520, 160, 89, 16))
        self.radioButton_3.setAutoExclusive(True)
        self.radioButton_3.setObjectName("radioButton_3")
        self.radioButton_4 = QtWidgets.QRadioButton(Form)
        self.radioButton_4.setGeometry(QtCore.QRect(520, 180, 89, 16))
        self.radioButton_4.setAutoExclusive(True)
        self.radioButton_4.setObjectName("radioButton_4")
        self.radioButton_5 = QtWidgets.QRadioButton(Form)
        self.radioButton_5.setGeometry(QtCore.QRect(520, 240, 89, 16))
        self.radioButton_5.setAutoExclusive(True)
        self.radioButton_5.setObjectName("radioButton_5")
        self.radioButton_6 = QtWidgets.QRadioButton(Form)
        self.radioButton_6.setGeometry(QtCore.QRect(520, 260, 89, 16))
        self.radioButton_6.setAutoExclusive(True)
        self.radioButton_6.setObjectName("radioButton_6")
        self.radioButton_7 = QtWidgets.QRadioButton(Form)
        self.radioButton_7.setGeometry(QtCore.QRect(520, 320, 89, 16))
        self.radioButton_7.setAutoExclusive(True)
        self.radioButton_7.setObjectName("radioButton_7")
        self.radioButton_8 = QtWidgets.QRadioButton(Form)
        self.radioButton_8.setGeometry(QtCore.QRect(520, 340, 89, 16))
        self.radioButton_8.setAutoExclusive(True)
        self.radioButton_8.setObjectName("radioButton_8")
        self.label_15.raise_()
        self.label_14.raise_()
        self.label_13.raise_()
        self.label_12.raise_()
        self.label_5.raise_()
        self.label_8.raise_()
        self.label_10.raise_()
        self.label.raise_()
        self.label_3.raise_()
        self.label_2.raise_()
        self.label_4.raise_()
        self.label_6.raise_()
        self.label_7.raise_()
        self.label_9.raise_()
        self.label_11.raise_()
        self.pushButton.raise_()
        self.radioButton.raise_()
        self.radioButton_2.raise_()
        self.radioButton_3.raise_()
        self.radioButton_4.raise_()
        self.radioButton_5.raise_()
        self.radioButton_6.raise_()
        self.radioButton_7.raise_()
        self.radioButton_8.raise_()

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Cai_shengxiao"))
        self.label_5.setText(_translate("Form", "Designed By"))
        self.label_8.setText(_translate("Form", "生肖猜猜看"))
        self.label.setText(_translate("Form", "第一组"))
        self.label_3.setText(_translate("Form", "狗 羊 猴 鸡 猪 狗"))
        self.label_2.setText(_translate("Form", "第二组"))
        self.label_4.setText(_translate("Form", "第三组"))
        self.label_6.setText(_translate("Form", "第四组"))
        self.label_7.setText(_translate("Form", "龙 蛇 兔 猪 马 龙"))
        self.label_9.setText(_translate("Form", "牛 虎 狗 马 蛇 鸡"))
        self.label_11.setText(_translate("Form", "马 狗 猴 虎 鼠 龙"))
        self.pushButton.setText(_translate("Form", "猜!"))
        self.radioButton.setText(_translate("Form", "存在"))
        self.radioButton_2.setText(_translate("Form", "不存在"))
        self.radioButton_3.setText(_translate("Form", "存在"))
        self.radioButton_4.setText(_translate("Form", "不存在"))
        self.radioButton_5.setText(_translate("Form", "存在"))
        self.radioButton_6.setText(_translate("Form", "不存在"))
        self.radioButton_7.setText(_translate("Form", "存在"))
        self.radioButton_8.setText(_translate("Form", "不存在"))
import ziyuan_rc

三、主要程序详解

1.导入相关模块

python 复制代码
import sys
from UI_shengxiao import *
from PyQt5.QtWidgets import QApplication, QWidget, QButtonGroup

# 保持窗口大小和qtdesigner中的一致
from PyQt5 import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)

导入前端页面设计文件:UI_shengxiao .py;不懂为啥需要导入Qtcore的,请看************************************************************************************************************************************************************************************************************************************************************一键曝光:Python+PyQt实现的文件目录透视镜************************************************************************************************************************************************************************************************************************************************************

2.初始化设置

python 复制代码
    def __init__(self):
        super(QWidget, self).__init__()
        self.setupUi(self)

        self.radioButton.clicked.connect(self.yizu)
        self.radioButton_2.clicked.connect(self.yizu)
        self.radioButton_3.clicked.connect(self.erzu)
        self.radioButton_4.clicked.connect(self.erzu)
        self.radioButton_5.clicked.connect(self.sanzu)
        self.radioButton_6.clicked.connect(self.sanzu)
        self.radioButton_7.clicked.connect(self.sizu)
        self.radioButton_8.clicked.connect(self.sizu)
        self.pushButton.clicked.connect(self.cai)

        self.group1 = QButtonGroup()
        self.group1.addButton(self.radioButton)
        self.group1.addButton(self.radioButton_2)
        self.group2 = QButtonGroup()
        self.group2.addButton(self.radioButton_3)
        self.group2.addButton(self.radioButton_4)
        self.group3 = QButtonGroup()
        self.group3.addButton(self.radioButton_5)
        self.group3.addButton(self.radioButton_6)
        self.group4 = QButtonGroup()
        self.group4.addButton(self.radioButton_7)
        self.group4.addButton(self.radioButton_8)

        self.result_1 = '2'
        self.result_2 = '2'
        self.result_3 = '2'
        self.result_4 = '2'

        self.jieguo  = ['0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100']
        self.shengxiao = ['鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊', '猴', '鸡', '狗', '猪']

首先将radio button按组绑定于不同的函数;因所有radio button在默认情况下是互斥的 ,即只能单选,不能显示多选效果 ,所以建立button分组体系将8个radio button分为四组,在每一组中的两两radio button均是互斥的,可以单选;接着定义4个变量结果的初始值为2(不是0和1均可 ,为后续方便操作,这里使用str类型,而不是int整型);最后建立映射列表jieguo和shengxiao,两者根据索引是一一对应的关系(当然也可以使用字典)。

3.组内判断

python 复制代码
    def yizu(self):
        if (self.radioButton.isChecked() == True) and (self.radioButton_2.isChecked() == False):
            self.result_1 = '1'
        if (self.radioButton.isChecked() == False) and (self.radioButton_2.isChecked() == True):
            self.result_1 = '0'

    def erzu(self):
        if (self.radioButton_3.isChecked() == True) and (self.radioButton_4.isChecked() == False):
            self.result_2 = '1'
        if (self.radioButton_3.isChecked() == False) and (self.radioButton_4.isChecked() == True):
            self.result_2 = '0'

    def sanzu(self):
        if (self.radioButton_5.isChecked() == True) and (self.radioButton_6.isChecked() == False):
            self.result_3 = '1'
        if (self.radioButton_5.isChecked() == False) and (self.radioButton_6.isChecked() == True):
            self.result_3 = '0'

    def sizu(self):
        if (self.radioButton_7.isChecked() == True) and (self.radioButton_8.isChecked() == False):
            self.result_4 = '1'
        if (self.radioButton_7.isChecked() == False) and (self.radioButton_8.isChecked() == True):
            self.result_4 = '0'

四个组判断结构一致,对属于各自的两个radio button选择状态分别进行判断:如果选择第一个radio button,不选后一个radio button,则为"存在",更新result值为"1",表示用户属相在对应组别中"存在";否则更新result值为"0",表示用户属相在对应组别中"不存在"。

4.猜测过程

python 复制代码
    def cai(self):
        if (self.result_1 == '2') or (self.result_2 == '2') or (self.result_1 == '3') or (self.result_4 == '2'):
            QtWidgets.QMessageBox.critical(self, "提示", "有空余选项未选择!")
        else:
            zongjieguo = self.result_1+self.result_2+self.result_3+self.result_4
            # print(zongjieguo)
            if zongjieguo in self.jieguo:
                shengxiao = self.shengxiao[self.jieguo.index(zongjieguo)]
                QtWidgets.QMessageBox.information(self, "成功", "你的生肖是" +shengxiao)
            else:
                QtWidgets.QMessageBox.critical(self, "提示", "请按照实际情况进行选择!")

result值一旦有一个为初始值2的话,即证明用户未对某个组别进行判断选择,因此提示用户"有空余选项未选择!" ;否则,将4个result值进行拼接,得到4位二进制数 (只不过是用字符串形式表示 );因4位二进制数能够表示的结果有16种,而生肖只有12种,所以在此还需要判断这四位二进制数是否在jieguo中,从而剔除0000,1101,1110,1111这四种结果;最后根据jieguo索引对应生肖,并成功输出。

四、总程序代码

python 复制代码
import sys
from UI_shengxiao import *
from PyQt5.QtWidgets import QApplication, QWidget, QButtonGroup

# 保持窗口大小和qtdesigner中的一致
from PyQt5 import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)

class login_interface(QWidget, Ui_Form):
    def __init__(self):
        super(QWidget, self).__init__()
        self.setupUi(self)

        self.radioButton.clicked.connect(self.yizu)
        self.radioButton_2.clicked.connect(self.yizu)
        self.radioButton_3.clicked.connect(self.erzu)
        self.radioButton_4.clicked.connect(self.erzu)
        self.radioButton_5.clicked.connect(self.sanzu)
        self.radioButton_6.clicked.connect(self.sanzu)
        self.radioButton_7.clicked.connect(self.sizu)
        self.radioButton_8.clicked.connect(self.sizu)
        self.pushButton.clicked.connect(self.cai)

        self.group1 = QButtonGroup()
        self.group1.addButton(self.radioButton)
        self.group1.addButton(self.radioButton_2)
        self.group2 = QButtonGroup()
        self.group2.addButton(self.radioButton_3)
        self.group2.addButton(self.radioButton_4)
        self.group3 = QButtonGroup()
        self.group3.addButton(self.radioButton_5)
        self.group3.addButton(self.radioButton_6)
        self.group4 = QButtonGroup()
        self.group4.addButton(self.radioButton_7)
        self.group4.addButton(self.radioButton_8)

        self.result_1 = '2'
        self.result_2 = '2'
        self.result_3 = '2'
        self.result_4 = '2'

        self.jieguo  = ['0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100']
        self.shengxiao = ['鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊', '猴', '鸡', '狗', '猪']

    def yizu(self):
        if (self.radioButton.isChecked() == True) and (self.radioButton_2.isChecked() == False):
            self.result_1 = '1'
        if (self.radioButton.isChecked() == False) and (self.radioButton_2.isChecked() == True):
            self.result_1 = '0'

    def erzu(self):
        if (self.radioButton_3.isChecked() == True) and (self.radioButton_4.isChecked() == False):
            self.result_2 = '1'
        if (self.radioButton_3.isChecked() == False) and (self.radioButton_4.isChecked() == True):
            self.result_2 = '0'

    def sanzu(self):
        if (self.radioButton_5.isChecked() == True) and (self.radioButton_6.isChecked() == False):
            self.result_3 = '1'
        if (self.radioButton_5.isChecked() == False) and (self.radioButton_6.isChecked() == True):
            self.result_3 = '0'

    def sizu(self):
        if (self.radioButton_7.isChecked() == True) and (self.radioButton_8.isChecked() == False):
            self.result_4 = '1'
        if (self.radioButton_7.isChecked() == False) and (self.radioButton_8.isChecked() == True):
            self.result_4 = '0'

    def cai(self):
        if (self.result_1 == '2') or (self.result_2 == '2') or (self.result_1 == '3') or (self.result_4 == '2'):
            QtWidgets.QMessageBox.critical(self, "提示", "有空余选项未选择!")
        else:
            zongjieguo = self.result_1+self.result_2+self.result_3+self.result_4
            # print(zongjieguo)
            if zongjieguo in self.jieguo:
                shengxiao = self.shengxiao[self.jieguo.index(zongjieguo)]
                QtWidgets.QMessageBox.information(self, "成功", "你的生肖是" +shengxiao)
            else:
                QtWidgets.QMessageBox.critical(self, "提示", "请按照实际情况进行选择!")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = login_interface()
    w.show()
    sys.exit(app.exec_())

欢迎留言沟通交流!

相关推荐
大学生毕业题目2 天前
毕业项目推荐:83-基于yolov8/yolov5/yolo11的农作物杂草检测识别系统(Python+卷积神经网络)
人工智能·python·yolo·目标检测·cnn·pyqt·杂草识别
凯子坚持 c5 天前
当Python遇见高德:基于PyQt与JS API构建桌面三维地形图应用实战
javascript·python·pyqt·高德地图
Goona_6 天前
pyqt+Python证件号智能校验工具
pyqt
大学生毕业题目7 天前
毕业项目推荐:52-基于yolov8/yolov5/yolo11的红绿灯检测识别系统(Python+卷积神经网络)
人工智能·python·yolo·目标检测·cnn·pyqt·红绿灯检测
大学生毕业题目8 天前
毕业项目推荐:64-基于yolov8/yolov5/yolo11的蝴蝶种类检测识别系统(Python+卷积神经网络)
人工智能·python·yolo·目标检测·cnn·pyqt·蝴蝶检测
大学生毕业题目8 天前
毕业项目推荐:51-基于yolov8/yolov5/yolo11的反光衣检测识别系统(Python+卷积神经网络)
人工智能·python·yolo·目标检测·cnn·pyqt·反光衣检测
深兰科技9 天前
柳州市委常委、统战部部长,副市长潘展东率队首访深兰科技集团新总部,共探 AI 赋能制造大市与东盟合作新局
人工智能·beautifulsoup·numpy·pyqt·matplotlib·pygame·深兰科技
傻啦嘿哟12 天前
用PyQt快速搭建桌面应用:从零到实战的实用指南
pyqt
大学生毕业题目13 天前
毕业项目推荐:28-基于yolov8/yolov5/yolo11的电塔危险物品检测识别系统(Python+卷积神经网络)
人工智能·python·yolo·cnn·pyqt·电塔·危险物品