使用 Pyqt5 制作猜數(shù)游戲 GUI

這一節(jié)揪胃,我們介紹如何使用 Pyqt5 實現(xiàn)猜數(shù)游戲界面。
游戲效果圖:

![designer.PNG](https://upload-images.jianshu.io/upload_images/13452330-c2db7a241c6aebd8.PNG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

一、使用 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文件保存的地址粘招。

Python高效編程

轉(zhuǎn)換得到的 py 文件可以直接繼承使用啥寇。

三、制作 ui 文件

我們打開 Designer,選擇相應(yīng)控件辑甜,將其拖到合適的位置衰絮,保存即可 ui 文件。

這里磷醋,我選擇垂直布局猫牡,從上到下分別為 QLineEdit、QLabel邓线、QLabel淌友、QPushButton、QPushButton骇陈、QPushButton震庭。其中,標(biāo)簽名默認(rèn)為空字符串你雌,三個按鈕的文字分別為:確認(rèn)器联、退出游戲、重新開始匪蝙。

這樣主籍,我們就完成猜數(shù)游戲的界面制作了,接下來將控件與功能對應(yīng)起來即可逛球。

Python高效編程

通過 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)如下:

代碼結(jié)構(gòu).PNG

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ù)值蹬跃。

勝利.PNG
# 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ù)即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伐脖,一起剝皮案震驚了整個濱河市桐臊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晓殊,老刑警劉巖断凶,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異巫俺,居然都是意外死亡认烁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門介汹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來却嗡,“玉大人,你說我怎么就攤上這事嘹承〈凹郏” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵叹卷,是天一觀的道長撼港。 經(jīng)常有香客問我坪它,道長,這世上最難降的妖魔是什么帝牡? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任往毡,我火速辦了婚禮,結(jié)果婚禮上靶溜,老公的妹妹穿的比我還像新娘开瞭。我一直安慰自己,他們只是感情好罩息,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布嗤详。 她就那樣靜靜地躺著,像睡著了一般瓷炮。 火紅的嫁衣襯著肌膚如雪断楷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天崭别,我揣著相機(jī)與錄音,去河邊找鬼恐锣。 笑死茅主,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的土榴。 我是一名探鬼主播诀姚,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼玷禽!你這毒婦竟也來了赫段?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤矢赁,失蹤者是張志新(化名)和其女友劉穎糯笙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撩银,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡给涕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了额获。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片够庙。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖抄邀,靈堂內(nèi)的尸體忽然破棺而出耘眨,到底是詐尸還是另有隱情,我是刑警寧澤境肾,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布剔难,位于F島的核電站胆屿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏钥飞。R本人自食惡果不足惜莺掠,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望读宙。 院中可真熱鬧彻秆,春花似錦、人聲如沸结闸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桦锄。三九已至扎附,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間结耀,已是汗流浹背留夜。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留图甜,地道東北人碍粥。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像黑毅,于是被迫代替她去往敵國和親嚼摩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容