1. 程式人生 > >【PyQt5-Qt Designer】猜數字(小專案)

【PyQt5-Qt Designer】猜數字(小專案)

參考:https://zhuanlan.zhihu.com/p/28287825

https://www.cnblogs.com/hhh5460/p/5174266.html

 

最終效果:

 

 

 

 

 

 

 

 

 

 

 

本次練習涉及的知識點,主要是以下幾點:

  • 按鈕小提示

  • QLineEdit小部件使用

  • QMessageBox的使用

  • 關閉視窗事件觸發

 本案例使用Qt 設計師完成,使用pyqt5+python3 版本

方式一:

邏輯和介面分離思想

介面程式碼:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.setEnabled(True)
        Dialog.resize(400,280)
        # Dialog.setStyleSheet("image: url(:/圖片/05.jpg);")
        self.gridLayout = QtWidgets.QGridLayout(Dialog)
        self.gridLayout.setObjectName(
"gridLayout") self.lineEdit = QtWidgets.QLineEdit(Dialog) font = QtGui.QFont() font.setPointSize(17) font.setBold(False) font.setItalic(False) font.setWeight(50) self.lineEdit.setFont(font) self.lineEdit.setAutoFillBackground(False) self.lineEdit.setStyleSheet(
"") self.lineEdit.setFrame(True) self.lineEdit.setDragEnabled(False) self.lineEdit.setReadOnly(False) self.lineEdit.setCursorMoveStyle(QtCore.Qt.VisualMoveStyle) self.lineEdit.setClearButtonEnabled(False) self.lineEdit.setObjectName("lineEdit") self.gridLayout.addWidget(self.lineEdit, 1, 1, 1, 1) spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.gridLayout.addItem(spacerItem, 0, 1, 1, 1) spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.gridLayout.addItem(spacerItem1, 5, 1, 1, 1) spacerItem2 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.gridLayout.addItem(spacerItem2, 2, 1, 1, 1) spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem3, 1, 0, 1, 1) spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem4, 1, 2, 1, 1) self.pushButton = QtWidgets.QPushButton(Dialog) font = QtGui.QFont() font.setFamily("黑體") font.setPointSize(18) font.setBold(False) font.setItalic(False) font.setWeight(50) self.pushButton.setFont(font) self.pushButton.setLayoutDirection(QtCore.Qt.LeftToRight) self.pushButton.setAutoFillBackground(False) self.pushButton.setStyleSheet("font: 18pt \"黑體\";\n" "color: rgb(255, 0, 127);") self.pushButton.setDefault(False) self.pushButton.setFlat(False) self.pushButton.setObjectName("pushButton") self.gridLayout.addWidget(self.pushButton, 3, 1, 1, 1) spacerItem5 = QtWidgets.QSpacerItem(0, 0, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem5, 3, 0, 1, 1) spacerItem6 = QtWidgets.QSpacerItem(0, 0, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout.addItem(spacerItem6, 3, 2, 1, 1) self.retranslateUi(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): _translate = QtCore.QCoreApplication.translate Dialog.setWindowTitle(_translate("Dialog", "猜數字遊戲")) self.lineEdit.setText(_translate("Dialog", "請輸入數字")) self.pushButton.setText(_translate("Dialog", "我猜")) import pictures_rc
介面程式碼

邏輯程式碼:

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
# from Ui_猜數字介面 import Ui_Dialog
import random

class Dialog(QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setupUi(self)
        self.setWindowFlags(Qt.Window)  # 設定視窗最大化最小化
        self.answer = random.randint(0,100)     #獲得0,100之間的隨機整數
        print(self.answer)

    @pyqtSlot()
    def on_pushButton_clicked(self):
        you_guess = self.lineEdit.text()
        if int(you_guess) > self.answer:
            QMessageBox.information(self,
                                    "訊息框標題",
                                    "你猜的數大了",
                                    QMessageBox.Yes | QMessageBox.No)
        elif int(you_guess) < self.answer:
            QMessageBox.information(self,
                                    "訊息框標題",
                                    "你猜的數小了",
                                    QMessageBox.Yes | QMessageBox.No)
        else:
            QMessageBox.information(self,
                                    "訊息框標題",
                                    "恭喜你猜對了!",
                                    QMessageBox.Yes | QMessageBox.No)
            time.sleep(0.3)
            self.close()

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    ui = Dialog()
    ui.show()
    sys.exit(app.exec_())

方式二:

最終專案提交時可以把 介面和邏輯放在一個py檔案

# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import random
import pictures_rc

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.setEnabled(True)
        Dialog.resize(400,280)
        self.gridLayout = QtWidgets.QGridLayout(Dialog)
        self.gridLayout.setObjectName("gridLayout")
        self.lineEdit = QtWidgets.QLineEdit(Dialog)
        font = QtGui.QFont()
        font.setPointSize(17)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(50)
        self.lineEdit.setFont(font)
        self.lineEdit.setAutoFillBackground(False)
        self.lineEdit.setStyleSheet("")
        self.lineEdit.setFrame(True)
        self.lineEdit.setDragEnabled(False)
        self.lineEdit.setReadOnly(False)
        self.lineEdit.setCursorMoveStyle(QtCore.Qt.VisualMoveStyle)
        self.lineEdit.setClearButtonEnabled(False)
        self.lineEdit.setObjectName("lineEdit")
        self.gridLayout.addWidget(self.lineEdit, 1, 1, 1, 1)
        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem, 0, 1, 1, 1)
        spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem1, 5, 1, 1, 1)
        spacerItem2 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem2, 2, 1, 1, 1)
        spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem3, 1, 0, 1, 1)
        spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem4, 1, 2, 1, 1)
        self.pushButton = QtWidgets.QPushButton(Dialog)
        font = QtGui.QFont()
        font.setFamily("黑體")
        font.setPointSize(18)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(50)
        self.pushButton.setFont(font)
        self.pushButton.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.pushButton.setAutoFillBackground(False)
        self.pushButton.setStyleSheet("font: 18pt \"黑體\";\n"
"color: rgb(255, 0, 127);")
        self.pushButton.setDefault(False)
        self.pushButton.setFlat(False)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 3, 1, 1, 1)
        spacerItem5 = QtWidgets.QSpacerItem(0, 0, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem5, 3, 0, 1, 1)
        spacerItem6 = QtWidgets.QSpacerItem(0, 0, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem6, 3, 2, 1, 1)

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

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "猜數字遊戲"))
        self.lineEdit.setText(_translate("Dialog", "請輸入數字"))
        self.pushButton.setText(_translate("Dialog", "我猜"))

class Dialog(QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setupUi(self)
        self.setWindowFlags(Qt.Window)  # 設定視窗最大化最小化
        self.answer = random.randint(0,100)     #獲得0,100之間的隨機整數
        print(self.answer)

    @pyqtSlot()
    def on_pushButton_clicked(self):
        you_guess = self.lineEdit.text()
        if int(you_guess) > self.answer:
            QMessageBox.information(self,
                                    "訊息框標題",
                                    "你猜的數大了",
                                    QMessageBox.Yes | QMessageBox.No)
        elif int(you_guess) < self.answer:
            QMessageBox.information(self,
                                    "訊息框標題",
                                    "你猜的數小了",
                                    QMessageBox.Yes | QMessageBox.No)
        else:
            QMessageBox.information(self,
                                    "訊息框標題",
                                    "恭喜你猜對了!",
                                    QMessageBox.Yes | QMessageBox.No)
            time.sleep(0.3)
            self.close()


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    ui = Dialog()
    ui.show()
    sys.exit(app.exec_())