目录
一、引言
二、GUI界面设计
1.效果演示
2.相关提示
3.界面设计.py
三、主要程序详解
1.导入相关模块
2.初始化设置
3.组内判断
4.猜测过程
四、总程序代码
一、引言
在数字时代,传统文化与编程语言的碰撞总能迸发奇妙火花。本项目以PyQt+Python为技术载体,将古老的十二生肖文化与二进制算法相结合,打造一款互动占卜工具。用户通过图形化界面判断,系统会将其自动转换为二进制代码并推算生肖。既是对数理思维的现代化诠释,也是对PyQt事件驱动模型与Python数据处理能力的趣味实践。
二、GUI界面设计
使用PyQt5进行界面的搭建,界面如下:
初始界面搭建采用极简风格。用户通过四次选择,在对应四个组别中分别判断是否存在自身属相,从而给出四个存在与否的答案,最终点击“猜!”,即可弹出计算机所预测的属相。
1.效果演示
以属猴为例:第一组和第四组中均存在“猴”,第二组和第三组中不存在“猴”,则由第一组到第四组分别选择“存在”、“不存在”、“不存在”、“存在”,最后程序通过这四次答案给出的结果同样是“猴”,则猜测正确,其他生肖同理。
但当未选择选项时,或存在空白选项时,会有“有空余选项未选择!”的提示;当均选择“存在”或“不存在”时(当然也存在其他情况,后面进行详细解释),也会出现“请按照实际情况进行选择!”的提示(因为按照组别内容,确实不满足条件,肯定是用户有意选错)。
2.相关提示
3.界面设计.py
通过pyuic5产生的GUI界面代码UI_shengxiao.py如下:
# -*- 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, QtWidgetsclass 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.translateForm.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.导入相关模块
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.初始化设置
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.组内判断
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.猜测过程
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索引对应生肖,并成功输出。
四、总程序代码
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_())
欢迎留言沟通交流!