【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內容是一樣的,只是用在不同的地方,所以程式碼不是那麼多。
程式分析
程式方法:
- Restart:生成隨機數,方便迴圈呼叫,主要用於重新開始遊戲;
- EnterClick:用於鍵盤觸發事件,即:按下回車鍵所觸發的事件;
- 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)
- 引數第一項root指的是父視窗;
- 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()
- pack()函式用於顯示,總之需要顯示的東西都pack;
- 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詳細教程