目录
一、引言
在数字时代,传统文化与编程语言的碰撞总能迸发奇妙火花。本项目以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_())
欢迎留言沟通交流!