1. 程式人生 > >【Python初學】GUI猜數遊戲+打包(生成.exe可執行程式)

【Python初學】GUI猜數遊戲+打包(生成.exe可執行程式)

Python初學——GUI猜數遊戲

對於像我一樣的Python初學者,做練習總是像學C一樣從命令視窗輸出我們的程式,但是這樣子很無聊,不會變著花樣來。所以我在做Python練習時候,練習了一些有遊戲題目,但都是命令視窗式的遊戲,所以我就想把這種遊戲圖形化出來,不單單是輸入輸出!所以我們從Python最基礎的猜數遊戲開始

Python猜數遊戲

猜數遊戲,就是讓電腦隨機給出一個數字,然後讓玩家去猜這個數字,所以遊戲的主體就是兩個部分:

1、生成隨機數

import random
a = int(random.randrange(1, 100))

2、二分法做判斷

if(_number > a):
    print('請輸入一個小一點的數字!'
) elif(_number < a): print('請輸入一個大一點的數字!') else: print('恭喜你,猜對啦!')

而把它們相連線的是:while迴圈,所以整體就是

import random

print('遊戲介紹:電腦會從1-100中隨機選擇一個數字,請你猜測這個數字是多少?')
_isGame = input('是否(y/n)開始猜數遊戲?')
a = int(random.randrange(1, 100))
while (_isGame == 'y'):
    _number = int(input('請輸入你猜測的數字'))

    if
(_number > a): print('請輸入一個小一點的數字!') elif(_number < a): print('請輸入一個大一點的數字!') else: print('恭喜你,猜對啦!') _isGame = input('是否(y/n)開始猜數遊戲?') a = int(random.randrange(1, 100))

以上是博主做Python 100中練習而來的。原文戳這裡!

GUI+猜數遊戲

下面我們開始使用Python的Tkinter來將遊戲圖形化:

#coding:utf-8
from tkinter import * import random import time def ReStart(): start = time.clock() global GameNumber GameNumber = random.randrange(1, 100) ReStart() root = Tk() root.title("GuessNumber") num = StringVar() E1 = Entry(root,width = 5,textvariable = num,font=("", 40)) b = num.set('') var = StringVar() label = Label( root, textvariable=var,bg = 'red',width = 50,font=("", 20)) var.set("從1-100中隨機選擇一個數字,請你猜測這個數字是多少?") def EnterClick(event): a = E1.get() isNum = a.isdigit() print(isNum) if isNum: number = int(a) if number > GameNumber: var.set("請輸入小一點的數字" ) b = num.set('') elif number < GameNumber: var.set("請輸入大一點的數字" ) b = num.set('') else: var.set("恭喜你,猜對了!是否繼續遊戲?(Y/N)") b = num.set('') end = time.clock() else: if a == 'y' or a == 'Y': ReStart() b = num.set('') var.set("從1-100中隨機選擇一個數字,請你猜測這個數字是多少?") elif a== 'n' or a =='N': root.destroy() b = num.set('') else: b = num.set('') def onclick(): a = E1.get() isNum = a.isdigit() print(isNum) if isNum: number = int(a) if number > GameNumber: var.set("請輸入小一點的數字") b = num.set('') elif number < GameNumber: var.set("請輸入大一點的數字") b = num.set('') else: var.set("恭喜你,猜對了!是否繼續遊戲?(Y/N)") b = num.set('') else: if a == 'y' or a == 'Y': ReStart() b = num.set('') var.set("從1-100中隨機選擇一個數字,請你猜測這個數字是多少?") elif a== 'n' or a =='N': root.destroy() b = num.set('') else: b = num.set('') button = Button(root,text = "輸入",font=("", 25),command =lambda:onclick()) E1.bind('<Return>',EnterClick) button.pack(side = BOTTOM) E1.pack(side = BOTTOM) label.pack() root.mainloop()

注:EnterClick與onclick內容是一樣的,只是用在不同的地方,所以程式碼不是那麼多。
程式執行圖:

程式分析

程式方法:

  1. Restart:生成隨機數,方便迴圈呼叫,主要用於重新開始遊戲;
  2. EnterClick:用於鍵盤觸發事件,即:按下回車鍵所觸發的事件;
  3. onclick:用於按鈕的事件,同上;

GUI主幹:
建立一個APP的視窗

root = Tk()     //呼叫Tk(),可以理解為建立個App
root.title("GuessNumber")

Entry主要用來接收使用者輸入,如果想得到使用者輸入的字元,新增引數textvariable 。

num = StringVar()   //引用textvariable ,必須先定義StringVar()
E1 = Entry(root,width = 5,textvariable = num,font=("", 40))
b = num.set('')

Label用於建立標籤,這裡用作反饋使用者的顯示視窗。

var = StringVar()
label = Label( root, textvariable=var,bg = 'red',width = 50,font=("", 20))
var.set("從1-100中隨機選擇一個數字,請你猜測這個數字是多少?")

觸發事件:

a = E1.get()            //獲取使用者輸入內容
isNum = a.isdigit()     //判斷使用者輸入的是數字還是字元
print(isNum)            //寫程式是做bug除錯用

b = num.set('')         //置空Enter內容

新增按鈕Button:

button = Button(root,text = "輸入",font=("", 25),command =lambda:onclick())
button.pack(side = BOTTOM)
  1. 引數第一項root指的是父視窗;
  2. command指的是點選按鈕執行的內容,這裡指向onclick方法;

設定鍵盤事件:

E1.bind('<Return>',EnterClick)

bing主要用於event,鍵盤事件觸發,Return指的是回車鍵(博主在這裡浪費很多時間,以為Enter是回車/(ㄒoㄒ)/~~),其實Enter指的是:
The mouse pointer entered the widget (this event doesn’t mean that the user pressed the Enter key!).
傳送門:Events and Bindings

最後我們收工:

E1.pack(side = BOTTOM)
button.pack(side = BOTTOM)
label.pack()
root.mainloop()
  1. pack()函式用於顯示,總之需要顯示的東西都pack;
  2. side引數指向位置,具體引數查文件;

程式打包,生成可執行.exe檔案

Python外掛提供打包功能,首先嚐試的是py2exe,但打包時有bug,無法修復,查資料發現py2exe以及年久失修了,所以不要用博主用的Pyinstaller,一鍵打包。

具體執行方式:
開啟終端,切換Python檔案目錄,執行:

pyinstaller -F -w -i main.py  

我的程式檔名為CSDN.py,所以執行:

pyinstaller -F -w CSDN.py
引數 用途
-F 表示生成單個可執行檔案
-w 表示去掉控制檯視窗,這在GUI介面時非常有用。
-p 表示你自己自定義需要載入的類路徑,一般情況下用不到
-i 表示可執行檔案的圖示

如果設定-F,會生成一個8m的.EXE可執行程式;
如果不設定-F,會生成一個程式集。
傳送門:pyinstaller詳細教程