基于我們前面學(xué)習(xí)的內(nèi)容,我們已經(jīng)可以進行一些小程序的開發(fā),本節(jié)我們就來通過兩個練習(xí)來進一步掌握相關(guān)知識。
1. 猜數(shù)字
使用Tkinter開發(fā)一個猜數(shù)字游戲,運行效果如圖所示。游戲中電腦隨機生成1024以內(nèi)數(shù)字,使用者去猜,如果猜得數(shù)字過大過小都會進行提示并把范圍縮小,程序要統(tǒng)計玩家猜的次數(shù),最后提示猜測次數(shù)。
點擊猜之后會呈現(xiàn)下圖界面:
程序代碼如下:
from tkinter import * import random number = random.randint(0,1024) running = True num = 0 minn = 0 maxx = 1024 def Close(event): root.destroy() def Guess(event): global running global num global minn global maxx if running: guess1 = int(events.get()) if guess1 == number: labelqval('恭喜答對了') num+=1 running = False numGuess() elif guess1<number: if guess1>minn: minn = guess1 num+=1 labelqval('猜小了哦!,請輸入'+str(minn)+'到'+str(maxx)+'之間的任意整數(shù)') else : if guess1<maxx: maxx = guess1 num+=1 labelqval('猜大了哦!,請輸入'+str(minn)+'到'+str(maxx)+'之間的任意整數(shù)') else: labelqval('你已經(jīng)答對了!') def numGuess(): if num == 1: labelqval('一次就答對了!') elif num<10: labelqval('十次之內(nèi)就答對了?。?!嘗試次數(shù):'+str(num)) else : labelqval('猜數(shù)字,你已經(jīng)猜了超過十次了。。。嘗試次數(shù):'+str(num)) def labelqval(vtext): label_a.config(label_a,text=vtext) root=Tk(className='猜數(shù)字游戲') root.geometry('400x90+200+200') label_a=Label(root,width='80') label_a.pack(side='top') events = Entry(root,width='40') btnGuess = Button(root,text='猜') events.pack(side='left') events.bind('<Return>',Guess) btnGuess.bind('<Button-1>',Guess) btnGuess.pack(side='left') btnClose = Button(root,text='關(guān)閉') btnClose.bind('<Button-1>',Close) btnClose.pack(side = 'left') labelqval('請輸入0到1024之間的任意整數(shù):') events.focus_set() print(number) root.mainloop()
這個代碼為不加注釋的代碼,使用的內(nèi)容我們前面基本都學(xué)習(xí)過,大家可以通過前面學(xué)習(xí)的知識去嘗試著解決這個問題,最后參考上面的代碼,去自己理解一下這個程序的實現(xiàn)細(xì)節(jié)。
2. 發(fā)牌游戲
游戲——撲克牌發(fā)牌程序窗體圖形版:
4名選手打牌,電腦隨機將52張牌(不含大小王)發(fā)給4名選手,在屏幕上顯示每位牌手的牌,程序的運行效果如圖所示。
撲克牌圖片在鏈接中提取。
鏈接:https://pan.baidu.com/s/1UmTpj4iSksZxF-K0GLaT_A 提取碼:gm2x
下面我們會使用到我們上一節(jié)講到的canvas模塊,還有一個新的方法。
image=canvas.create_image(50,50,image="picture.gif")
代碼如下:
import random from tkinter import * n = 52 def gen_pocker(n): x = 100 while(x>0): x = x-1 p1 = random.randint(0,n-1) p2 = random.randint(0,n-1) t = pocker[p1] pocker[p1] = pocker[p2] pocker[p2] = t return pocker pocker = [i for i in range(n)] pocker = gen_pocker(n) print(pocker) (player1,player2,player3,player4) = ([],[],[],[]) (p1,p2,p3,p4) = ([],[],[],[]) root = Tk() cv = Canvas(root,bg = 'white',width = 700,height = 600)#創(chuàng)建一個畫布,在畫布中來顯示這些牌 imgs = [] for i in range(1,5):#注意下面的內(nèi)容,我們把每個數(shù)字的撲克牌對應(yīng)為每張圖片 for j in range(1,14): imgs.insert((i-1)*13+(j-1),PhotoImage(file = r'C:/Users/輕煙/PycharmProjects/untitled1/teach/puke-images/' + str(i) + "-" + str(j) + ".gif")) for x in range(13): m=x*4 p1.append(pocker[m]) p2.append(pocker[m + 1]) p3.append(pocker[m + 2]) p4.append(pocker[m + 3]) p1.sort() p2.sort() p3.sort() p4.sort() for x in range(0,13):#注意下面是畫布的功能使用,對象為圖片對象,前面為它的具體位置,我們可以通過更改位置信息來顯示牌的具體定位 img = imgs[p1[x]] player1.append(cv.create_image((200+20*x,80),image = img)) img = imgs[p2[x]] player2.append(cv.create_image((100,150+20*x),image = img)) img = imgs[p3[x]] player3.append(cv.create_image((200+20*x,500),image = img)) img = imgs[p4[x]] player4.append(cv.create_image((560,150+20*x),image = img)) print("player1:",player1) print("player2:",player2) print("player3:",player3) print("player4:",player4) cv.pack() root.mainloop()
這個題目的實現(xiàn)原理我們在前面的例題中已經(jīng)分析過,在這里我們只要注意我們使用了圖形界面去把每張牌的數(shù)字去對應(yīng)每一個圖片,然后我們在通過canvas控件的定位功能把所有的牌在畫布中顯示出來,使用的過程中一定要注意圖片的路徑問題。
3. 總結(jié)
關(guān)于Tkinter的學(xué)習(xí)我們就到這里,通過這些功能我們可以進行簡單的登錄界面,去設(shè)計UI界面,使用相關(guān)控件去開發(fā)程序,下面我們來學(xué)習(xí)另外一個GUI模塊——wxPython。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導(dǎo)課程