這一節(jié)揪胃,我們介紹如何使用 Pyqt5 實現(xiàn)猜數(shù)游戲界面。
游戲效果圖:
一、使用 Qt Designer
首先枯跑,選擇 Pycharm ->
File->
Settings->
Tools->
External Tools,點擊 + ,添加新項目白热。name 可以設(shè)為 'qt5'敛助,Program 那項填寫Qt designer 這個 exe 文件所在的位置。
這時候屋确,Tools 菜單欄就會出現(xiàn) External Tools 工具欄纳击,點擊這一項,就可以啟動 Qt designer攻臀。
二焕数、Pyuic
同樣,選擇 Pycharm ->
File->
Settings->
Tools->
External Tools,點擊 + 茵烈,添加新項目百匆。name 可以設(shè)為Pyuic
, Program 那項填寫你的python.exe
文件所在的地址呜投。Arguments 那項填寫-m PyQt5.uic.pyuic sample.ui -o sample.py
加匈。其中sample.ui
為你需要轉(zhuǎn)換的ui
文件,sample.py
為轉(zhuǎn)化得到的py
文件名仑荐。Working directory 填寫 sample.ui
在磁盤中的地址雕拼,我選擇的位置是D:\QQPCMgr\Desktop\Pyui
,這同時也是轉(zhuǎn)化后的sample.py
文件保存的地址粘招。
轉(zhuǎn)換得到的 py 文件可以直接繼承使用啥寇。
三、制作 ui 文件
我們打開 Designer,選擇相應(yīng)控件辑甜,將其拖到合適的位置衰絮,保存即可 ui 文件。
這里磷醋,我選擇垂直布局猫牡,從上到下分別為 QLineEdit、QLabel邓线、QLabel淌友、QPushButton、QPushButton骇陈、QPushButton震庭。其中,標(biāo)簽名默認(rèn)為空字符串你雌,三個按鈕的文字分別為:確認(rèn)器联、退出游戲、重新開始匪蝙。
這樣主籍,我們就完成猜數(shù)游戲的界面制作了,接下來將控件與功能對應(yīng)起來即可逛球。
通過 Pyuic 轉(zhuǎn)化得到的 py 文件代碼如下:
# Python高效編程
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(504, 551)
self.layoutWidget = QtWidgets.QWidget(Form)
self.layoutWidget.setGeometry(QtCore.QRect(170, 200, 137, 151))
self.layoutWidget.setObjectName("layoutWidget")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.layoutWidget)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.lineEdit = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEdit.setObjectName("lineEdit")
self.verticalLayout.addWidget(self.lineEdit)
self.label = QtWidgets.QLabel(self.layoutWidget)
self.label.setText("")
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
self.label_2 = QtWidgets.QLabel(self.layoutWidget)
self.label_2.setText("")
self.label_2.setObjectName("label_2")
self.verticalLayout.addWidget(self.label_2)
self.pushButton = QtWidgets.QPushButton(self.layoutWidget)
self.pushButton.setObjectName("pushButton")
self.verticalLayout.addWidget(self.pushButton)
self.pushButton_2 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButton_2.setObjectName("pushButton_2")
self.verticalLayout.addWidget(self.pushButton_2)
self.verticalLayout_2.addLayout(self.verticalLayout)
self.pushButton_3 = QtWidgets.QPushButton(self.layoutWidget)
self.pushButton_3.setObjectName("pushButton_3")
self.verticalLayout_2.addWidget(self.pushButton_3)
self.label_3 = QtWidgets.QLabel(Form)
self.label_3.setGeometry(QtCore.QRect(170, 60, 161, 16))
self.label_3.setObjectName("label_3")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.pushButton.setText(_translate("Form", "確認(rèn)"))
self.pushButton_2.setText(_translate("Form", "退出游戲"))
self.pushButton_3.setText(_translate("Form", "重新開始"))
self.label_3.setText(_translate("Form", "微信公眾號:Python高效編程"))
然后千元,我們讓主程序繼承這個基類,即可得到游戲界面颤绕。
四幸海、實現(xiàn)猜數(shù)游戲
代碼結(jié)構(gòu)如下:
1. 初始化
第一行的列表推導(dǎo)式,用于生成隨機(jī)數(shù)的右界奥务,并賦值給類變量 random_choice物独。
前兩行代碼用于繼承父類的 __init__
參數(shù),并執(zhí)行 self.setupUi() 函數(shù)氯葬。其次挡篓,初始化實例變量。接著調(diào)用 self.random_num()帚称,為以上的實例變量賦值官研。最后,調(diào)用 self.initUi() 函數(shù)來初始化界面闯睹。初始化的界面戏羽,會提示猜數(shù)范圍。
# Python高效編程
# 生成隨機(jī)數(shù)的右界
random_choice = [i * 100 for i in range(1, 20)]
def __init__(self, parent=None):
# 繼承主窗口類
super(MyMainWindow, self).__init__(parent)
self.setupUi(self)
# 隨機(jī)數(shù)的右界
self.guess_range = None
# 生成的隨機(jī)數(shù)
self.guess_num = None
# 提示范圍的左界
self.left = None
# 提示范圍的右界
self.right = None
# 產(chǎn)生隨機(jī)數(shù)
self.random_num()
# 初始化功能
self.initUi()
2. 生成隨機(jī)數(shù)
init_range() 函數(shù)為提示范圍的左右界賦值, _random_range() 函數(shù)隨機(jī)產(chǎn)生隨機(jī)數(shù)的右界楼吃,而 random_num() 用來產(chǎn)生最終的隨機(jī)數(shù)以及提示范圍始花。
#Python高效編程
def init_range(self):
# 為提示范圍的左右界賦值
self.left = 1
self.right = self.guess_range
@property
def _random_range(self):
# 隨機(jī)產(chǎn)生隨機(jī)數(shù)的右界
return random.choice(self.random_choice)
def random_num(self):
self.guess_range = self._random_range
# 產(chǎn)生隨機(jī)數(shù)
self.guess_num = random.randint(1, self.guess_range)
self.init_range()
3. 初始化界面
self.label.setText() 顯示標(biāo)簽的文本內(nèi)容妄讯,標(biāo)簽一初始顯示提示范圍。self.pushButton.clicked.connect() 是說酷宵,當(dāng)你摁下按鈕一亥贸,會運(yùn)行 self.guess() 函數(shù)。同理浇垦,按鈕二砌函、按鈕三分別對應(yīng)退出和重置功能。
def initUi(self):
# 提示數(shù)值范圍
self.label.setText('數(shù)值的范圍是:{}-{}'.format(self.left, self.right))
# 按下按鈕一溜族,運(yùn)行 self.guess() 函數(shù)
self.pushButton.clicked.connect(self.guess)
# 按下按鈕二,運(yùn)行 quit() 函數(shù)
self.pushButton_2.clicked.connect(qApp.quit)
# 按下按鈕三垦沉,運(yùn)行 self.reset() 函數(shù)
self.pushButton_3.clicked.connect(self.reset)
4. 主程序
text 用來接收 lineEdit 中的文本內(nèi)容煌抒,允許浮點型的字符串。其他類型字符串會提示錯誤厕倍,標(biāo)簽一提示輸入不合法寡壮,標(biāo)簽二提示隨機(jī)數(shù)的范圍,并清空 lineEdit 的文本框讹弯,將 text 賦值為空字符串况既。
如果字符串不為空,繼續(xù)執(zhí)行接下來的程序组民。首先棒仍,將得到的浮點數(shù)進(jìn)行向下取整操作(math.floor)。比較用戶輸入的數(shù)值與待猜數(shù)臭胜,如果待猜數(shù)大于用戶輸入的數(shù)值莫其,說明用戶猜小了。此時耸三,如果用戶輸入數(shù)值大于提示范圍的左界乱陡,就更新提示范圍的左界為用戶輸入的數(shù)值。此時標(biāo)簽一顯示提示范圍仪壮,標(biāo)簽二顯示“猜小了”憨颠。如果待猜數(shù)小于用戶輸入的數(shù)值,說明用戶猜大了积锅,執(zhí)行相反的操作爽彤。如果待猜數(shù)與用戶輸入的數(shù)值相同,那么說明用戶猜中了數(shù)字乏沸。QMessageBox.question() 函數(shù)用來顯示對話框淫茵,QMessageBox.Yes 參數(shù)是 Yes 鍵,并提示用戶猜中的數(shù)值蹬跃。
# Python高效編程
def guess(self):
# text 接受文本框中的文本
text = self.lineEdit.text()
# 異常處理
# 可處理數(shù)值型字符串匙瘪,其他輸入提示錯誤
try:
text = float(text)
except:
self.label.setText(' 輸入不合法')
self.label_2.setText('數(shù)值的范圍:{}-{}'.format(self.left, self.right))
self.lineEdit.clear()
text = ''
# 文本不為空繼續(xù)執(zhí)行文件
if text:
num = math.floor(text)
if self.guess_num == num:
QMessageBox.question(self, '勝利', '恭喜你猜中了:{}'.format(self.guess_num), QMessageBox.Yes)
self.reset()
elif self.guess_num > num:
if num > self.left:
self.left = num
self.label.setText('數(shù)值的范圍:{}-{}'.format(self.left, self.right))
self.label_2.setText(' 猜小了')
elif self.guess_num < num:
if num < self.right:
self.right = num
self.label.setText('數(shù)值的范圍:{}-{}'.format(self.left, self.right))
self.label_2.setText(' 猜大了')
self.lineEdit.clear()
5. 重置游戲
reset() 函數(shù)铆铆,用來重置游戲。首先將實例變量設(shè)為 None丹喻,并執(zhí)行 self.random_num()薄货,產(chǎn)生隨機(jī)數(shù),并更新提示范圍的左右界碍论。接著清空標(biāo)簽一和標(biāo)簽二的文本內(nèi)容谅猾。最后,初始化界面鳍悠,并顯示待猜數(shù)范圍税娜。
# Python高效編程
def reset(self):
# 重置游戲
self.guess_range = None
self.guess_num = None
self.left = None
self.right = None
self.random_num()
self.label.setText('')
self.label_2.setText('')
self.initUi()
6. 設(shè)置快捷鍵
Qt.Key_Return 代表 Enter 鍵,按下 Enter 鍵就相當(dāng)于按下按鈕一藏研,即確認(rèn)鍵敬矩。Qt.Key_Escape 相當(dāng)于 Esc 鍵,按下該鍵蠢挡,就會退出游戲弧岳。Qt.Key_R 相當(dāng)于 Ctrl + R 鍵,用來重置游戲业踏。
# Python高效編程
def keyPressEvent(self, e):
# 設(shè)置快捷鍵
if e.key() == Qt.Key_Return:
self.guess()
elif e.key() == Qt.Key_Escape:
qApp.quit()
elif e.key() == Qt.Key_R:
self.reset()
https://blog.csdn.net/weixin_43773093/article/details/86661359
以上便是本節(jié)的全部內(nèi)容禽炬,主要介紹了如何使用 Pyqt5 實現(xiàn)猜數(shù)游戲界面。如果需要獲取源代碼勤家,請關(guān)注微信公眾號:Python高效編程
腹尖,在微信后臺回復(fù)猜數(shù)
即可。