回顧一下GUI編程流程,設(shè)計(jì)UI界面->設(shè)計(jì)邏輯功能->測(cè)試->打包。
今天先用一個(gè)小栗子說(shuō)明這個(gè)過(guò)程,這次想做個(gè)猜數(shù)字的小游戲,程序自動(dòng)生成一個(gè)隨機(jī)的100以?xún)?nèi)的整數(shù),然后用戶(hù)輸入猜測(cè)的數(shù)字,程序會(huì)提示猜大了還是猜小了,如果用二分法的話(huà),7次以?xún)?nèi)應(yīng)該能夠猜中。
-
首先我們打開(kāi)designer,設(shè)計(jì)我們的小游戲界面。如下圖所示:
UI界面
我們新建了一個(gè)QWidget作為程序外框,內(nèi)部加入了一個(gè)空間容器QWidget,在此容器中加入了我們主要控件lineEdit和pushButton,并利用Spacers和Layout達(dá)到了我們希望的布局效果。保存ui文件。
利用pyuic將我們的ui文件轉(zhuǎn)化為py文件,并在主文件中導(dǎo)入該文件。
這是ui文件轉(zhuǎn)化為的py文件。
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'Guess_number.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(476, 361)
self.verticalLayout_3 = QtWidgets.QVBoxLayout(Form)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.verticalLayout_2 = QtWidgets.QVBoxLayout()
self.verticalLayout_2.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
self.verticalLayout_2.setContentsMargins(-1, -1, -1, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.widget = QtWidgets.QWidget(Form)
self.widget.setObjectName("widget")
self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.widget)
self.verticalLayout_5.setObjectName("verticalLayout_5")
self.verticalLayout_4 = QtWidgets.QVBoxLayout()
self.verticalLayout_4.setObjectName("verticalLayout_4")
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout_4.addItem(spacerItem)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_2.addItem(spacerItem1)
self.lineEdit = QtWidgets.QLineEdit(self.widget)
self.lineEdit.setInputMask("")
self.lineEdit.setObjectName("lineEdit")
self.horizontalLayout_2.addWidget(self.lineEdit)
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_2.addItem(spacerItem2)
self.verticalLayout_4.addLayout(self.horizontalLayout_2)
spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout_4.addItem(spacerItem3)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem4)
self.pushButton = QtWidgets.QPushButton(self.widget)
self.pushButton.setObjectName("pushButton")
self.horizontalLayout.addWidget(self.pushButton)
spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem5)
self.verticalLayout_4.addLayout(self.horizontalLayout)
spacerItem6 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout_4.addItem(spacerItem6)
self.verticalLayout_5.addLayout(self.verticalLayout_4)
self.verticalLayout_2.addWidget(self.widget)
self.verticalLayout_3.addLayout(self.verticalLayout_2)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "猜數(shù)字(100以?xún)?nèi))"))
self.lineEdit.setText(_translate("Form", "在這里輸入數(shù)字"))
self.pushButton.setToolTip(_translate("Form", "點(diǎn)擊這里猜數(shù)字"))
self.pushButton.setText(_translate("Form", "我猜"))
接下來(lái)我們?cè)谥鞒绦蛑幸朐撐募?/p>
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from Guess_number import Ui_Form # 引入ui轉(zhuǎn)化的py文件
from random import randint # 隨機(jī)數(shù)庫(kù)
class Dialog(QWidget,Ui_Form): # 此處引用導(dǎo)入的ui
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
self.setupUi(self)
self.num = randint(1, 100)
self.lineEdit.selectAll() # 設(shè)置輸入框全選
self.lineEdit.setFocus() # 設(shè)置焦點(diǎn)
self.pushButton.clicked.connect(self.showMessage) # 按鈕連接至我們的邏輯函數(shù)
def showMessage(self):
guessnumber = self.lineEdit.text()
if guessnumber.isdigit():
guessnumber = int(self.lineEdit.text())
if guessnumber > self.num:
QMessageBox.about(self, '結(jié)果', '猜大了!')
self.lineEdit.selectAll()
self.lineEdit.setFocus()
elif guessnumber < self.num:
QMessageBox.about(self, '結(jié)果', '猜小了!')
self.lineEdit.selectAll()
self.lineEdit.setFocus()
else:
QMessageBox.about(self, '結(jié)果', '答對(duì)了!進(jìn)入下一輪!')
self.num = randint(1, 100)
self.lineEdit.clear()
self.lineEdit.selectAll()
self.lineEdit.setFocus()
else:
self.input_error()
def closeEvent(self, event): # 重寫(xiě)關(guān)閉動(dòng)作,彈出消息框以確認(rèn)
reply = QMessageBox.question(self, '確認(rèn)', '確認(rèn)退出嗎',QMessageBox.Yes |QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
def keyPressEvent(self, event): # 將鍵盤(pán)輸入enter綁定在按鈕上
if (event.key() == Qt.Key_Enter):
self.pushButton.click()
if (event.key() == 16777220):
self.pushButton.click()
def input_error(self):
QMessageBox.critical(self, "錯(cuò)誤", "輸入錯(cuò)誤請(qǐng)重新輸入")
self.lineEdit.selectAll()
self.lineEdit.setFocus()
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
window = Dialog()
window.show()
sys.exit(app.exec_())
-
運(yùn)行試試看
-
最后利用pyinstaller打包文件,生成exe,pyinstaller的簡(jiǎn)單使用大家可以去查閱一下之前的文章。生成的exe就在dist文件夾下。
按照這個(gè)流程就可以自己去做一些自己想做的程序了哈。
自己要學(xué)習(xí)的東西還有很多,和別人的差距還是很大,有點(diǎn)小苦惱哎~~~
不過(guò)時(shí)間是自己擠出來(lái)的,爭(zhēng)取少玩一些游戲,少看些劇和綜藝!
加油,晚安~