最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python圖形用戶界面與游戲開發(fā)實(shí)例詳解

 更新時(shí)間:2022年09月01日 15:37:32   作者:Yi?Ian  
GUI是圖形用戶界面的縮寫,圖形化的用戶界面對使用過計(jì)算機(jī)的人來說應(yīng)該都不陌生,下面這篇文章主要給大家介紹了關(guān)于Python圖形用戶界面與游戲開發(fā)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

對于使用過計(jì)算機(jī)的人,應(yīng)該對圖形用戶界面(GUI)應(yīng)該都不會(huì)太陌生,這里就不在贅述。那么對于python這樣的動(dòng)態(tài)語言有沒有GUI相關(guān)的庫呢?答案是肯定有的,那么常見的有哪些呢?主要有tkinter、wxPython、PyQt、PyGTK等模塊,而tkinter是python默認(rèn)的模塊,沒有功能特別強(qiáng)大的GUI控件,所以真的要在python中進(jìn)行GUI開發(fā),推薦使用wxPython、PyQt、PyGTK等模塊。Pyhton還提供了Pygame游戲開發(fā)模塊。下面主要介紹tkinter、wxPython、Pygame的使用,廢話不多說直接開始吧,哈哈哈哈哈~

基于tkinter模塊的GUI

tkinter是基于Tk工具包的一個(gè)模塊,而Tk為控件的擺放提供了三種布局管理器,通過布局管理器可以對控件進(jìn)行定位,這三種布局管理器分別是:

Placer:開發(fā)者提供控件的大小和擺放位置

Packer:自動(dòng)將控件填充到合適的位置

Grid:基于網(wǎng)格坐標(biāo)來擺放控件

講了這些還是不知道tkinter怎么使用,那么我們直接介紹使用tkinter來開發(fā)GUI的基本步驟:

導(dǎo)入tkinter模塊中我們需要的東西
創(chuàng)建一個(gè)頂層窗口對象并用它來承載整個(gè)GUI應(yīng)用
在頂層窗口對象上添加GUI組件
通過代碼將這些GUI組件的功能組織起來
進(jìn)入主事件循環(huán)(main loop)

基于wxPython模塊的GUI

wxPython是一個(gè)Python包裝wxWidgets(c++編寫)的一個(gè)流行的跨平臺的GUI工具包,可以作為Python的一個(gè)擴(kuò)展模塊。wxObject類是wxPython API的核心模塊,它是所有類的基礎(chǔ)類,包括所有GUI應(yīng)用程序使用的部件。如wx.Button,wx.StaicText等。

Pygame游戲開發(fā)

Pygame是一個(gè)開源的Python模塊,專門用于多媒體應(yīng)用(如電子游戲)的開發(fā),其中包含對圖像、聲音、視頻、事件、碰撞等的支持。Pygame的使用基本步驟:

導(dǎo)入Pygame模塊

先初始化

構(gòu)建一個(gè)窗口

設(shè)置標(biāo)題

讓其保持運(yùn)行狀態(tài),直到用戶手動(dòng)關(guān)閉

先檢測事件,如果檢測到關(guān)閉按鈕那么就退出

下面從五方面來介紹Pygame的使用:

1.在游戲窗口中繪圖

我們可以通過Pygame中的draw模塊在游戲窗口中繪制各種圖形,主要包括:線條、矩形、多邊形、圓、橢圓、圓弧等。但最重要想說的不是這個(gè),而是“屏幕坐標(biāo)系”。什么是屏幕坐標(biāo)系,它就是指將屏幕左上角設(shè)置為坐標(biāo)原點(diǎn)‘(0, 0)’,向右是x軸的正向,向下是y軸的正向,在表示位置或者設(shè)置尺寸的時(shí)候,我們默認(rèn)的單位都是像素(像素概念)。說了那么多我們舉個(gè)例子更實(shí)際一些:

import pygame  # 導(dǎo)入pygame模塊
def main():
    # 初始化pygame模塊
    pygame.init()
    # 初始化顯示窗口并設(shè)置窗口尺寸
    screen = pygame.display.set_mode((888, 666))
    # 設(shè)置當(dāng)前窗口的標(biāo)題
    pygame.display.set_caption('888666')
    # 設(shè)置窗口背景色
    screen.fill((200, 102, 22))
    # 繪制一個(gè)圓(參數(shù)分別是: 屏幕, 顏色, 圓心位置, 半徑, 0表示填充圓)
    pygame.draw.circle(screen, (255, 0, 0,), (100, 100), 30, 0)
    # 刷新當(dāng)前窗口(渲染窗口將繪制的圖像呈現(xiàn)出來)
    pygame.display.flip()
    running = True
    # 開啟一個(gè)事件循環(huán)處理發(fā)生的事件
    while running:
        # 從消息隊(duì)列中獲取事件并對事件進(jìn)行處理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
 
if __name__ == '__main__':
    main()

2.圖形的處理

如果需要直接加載圖像到窗口上,可以使用pygame中image模塊的函數(shù)來加載圖像,再通過之前獲得的窗口對象的`blit`方法渲染圖像,代碼如下:

import pygame
WIN_WIDTH = 800
WIN_HEIGHT = 800
#初始化
pygame.init()
#構(gòu)建游戲窗口
chuangkou = pygame.display.set_mode((WIN_WIDTH,WIN_HEIGHT))
#設(shè)置游戲標(biāo)題
pygame.display.set_caption('圖片')
# 填充背景
chuangkou.fill((255,255,255))
pygame.display.flip()
image = pygame.image.load('./res/ball.png')
# 在窗口上渲染圖像
chuangkou.blit(image, (50, 50))
pygame.display.update()   #再次刷新
 
# 開啟一個(gè)事件循環(huán)處理發(fā)生的事件
while True:
    for x in pygame.event.get():
        if x .type==pygame.QUIT:
            exit()

3.動(dòng)畫效果

動(dòng)畫效果其實(shí)就是把不連續(xù)的圖片連續(xù)的播放,只要每秒鐘達(dá)到了一定的幀數(shù),那么就可以做出比較流暢的動(dòng)畫效果,代碼如下:

import pygame
WIN_WIDTH = 800
WIN_HEIGHT = 800
#初始化
pygame.init()
#構(gòu)建游戲窗口
chuangkou = pygame.display.set_mode((WIN_WIDTH,WIN_HEIGHT))
#設(shè)置游戲標(biāo)題
pygame.display.set_caption('圖片')
# 填充背景
chuangkou.fill((255,255,255))
pygame.display.flip()
image = pygame.image.load('./res/ball.png')
# 在窗口上渲染圖像
chuangkou.blit(image, (50, 50))
pygame.display.update()   #再次刷新
 
num =1
d = 0 #初始化旋轉(zhuǎn)的角度
# 開啟一個(gè)事件循環(huán)處理發(fā)生的事件
while True:
    num += 1
    if num % 20 == 0:
        d+=2
        newimage = pygame.transform.rotozoom(image, d, 0.2)
        chuangkou.blit(newimage, (0, 0))
        pygame.display.update()
 
    for x in pygame.event.get():
        if x .type==pygame.QUIT:
            exit()

4.碰撞檢測

在游戲中會(huì)有很多對象出現(xiàn),而這些對象之間的“碰撞”在所難免,比如炮彈擊中了飛機(jī)、箱子撞到了地面等。碰撞檢測在絕大多數(shù)的游戲中都是一個(gè)必須得處理的至關(guān)重要的問題,pygame的sprite(動(dòng)畫精靈)模塊就提供了對碰撞檢測的支持。通常情況下,我們使用該模塊的基類 Sprite 來創(chuàng)建一個(gè)子類,從而達(dá)到處理精靈的目的。當(dāng)我們需要管理大量的精靈時(shí),操作它們將變得復(fù)雜,此時(shí)通過構(gòu)建精靈容器(group 類)也就是精靈組來統(tǒng)一管理這些精靈。構(gòu)建方法如下:

group = pygame.sprite.Group() # 創(chuàng)建精靈組

group.add(sprite_one) # 向組內(nèi)添加一個(gè)精靈

此同時(shí)pygame.sprite模塊也提供了多種檢測精靈是否碰撞的方法,如下所示:

方法說明
pygame.sprite.collide_rect()兩個(gè)精靈之間的矩形檢測,即矩形區(qū)域是否有交匯,返回一個(gè)布爾值
pygame.sprite.collide_circle() 兩個(gè)精靈之間的圓形檢測,即圓形區(qū)域是否有交匯,返回一個(gè)布爾值
pygame.sprite.collide_mask()兩個(gè)精靈之間的像素蒙版檢測,更為精準(zhǔn)的一種檢測方式
pygame.sprite.spritecollide()精靈和精靈組之間的矩形碰撞檢測,一個(gè)組內(nèi)的所有精靈會(huì)逐一地對另外一個(gè)單個(gè)精靈進(jìn)行碰撞檢測,返回值是一個(gè)列表,包含了發(fā)生碰撞的所有精靈
pygame.sprite.spritecollideany()精靈和精靈組之間的矩形碰撞檢測,上述函數(shù)的變體,當(dāng)發(fā)生碰撞時(shí),返回組內(nèi)的一個(gè)精靈,無碰撞發(fā)生時(shí),返回 None
pygame.sprite.groupcollide()檢測在兩個(gè)組之間發(fā)生碰撞的所有精靈,它返回值是一個(gè)字典,將第一組中發(fā)生碰撞的精靈作為鍵,第二個(gè)組中發(fā)生碰撞的精靈作為值

說了那么多關(guān)于pygame.sprite碰撞檢測的函數(shù),下面我們舉個(gè)例子來得更直觀一點(diǎn):

import sys, pygame
from random import *
class MyClass(pygame.sprite.Sprite):
    def __init__(self, image_file, location, speed):
        pygame.sprite.Sprite.__init__(self)        #初始化動(dòng)畫精靈
        self.image = pygame.image.load(image_file) #加載圖片
        self.rect = self.image.get_rect()          #得到定義圖像邊界矩形
        self.rect.left, self.rect.top = location   #設(shè)置球的初始位置
        self.speed = speed                         #創(chuàng)建一個(gè)速度
    def move(self):
        self.rect = self.rect.move(self.speed)
        if self.rect.left < 0 or self.rect.right > width:
            self.speed[0] = -self.speed[0]
        if self.rect.top < 0 or self.rect.bottom > height:
            self.speed[1] = -self.speed[1]
def animate(group):
    screen.fill([255, 255, 255])
    for ball in group:
        ball.move()
    for ball in group:
        group.remove(ball)      #從組刪除精靈
        #檢查精靈與組的碰撞
        if pygame.sprite.spritecollide(ball, group, False): 
            ball.speed[0] = -ball.speed[0]
            ball.speed[1] = -ball.speed[1]
        group.add(ball)
        screen.blit(ball.image, ball.rect)
    pygame.display.flip()
    pygame.time.delay(20)
#設(shè)置窗口大小和顏色    
size = width, height = 640, 480
screen = pygame.display.set_mode(size)
screen.fill([255, 255, 255])
img_file = "beach_ball.png"
clock = pygame.time.Clock()
group = pygame.sprite.Group()   #創(chuàng)建精靈組
#將球增加到列表
for row in range(0, 2):
    for column in range(0, 2):
        location = [column * 180 + 10, row * 180 + 10]
        speed = [choice([-4, 4]), choice([-4, 4])]     #讓每個(gè)球變得隨機(jī)性
        ball = MyClass(img_file, location, speed)
        group.add(ball)
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            frame_rate = clock.get_fps()
            print( "frame rate = ", frame_rate)   
    animate(group)   
    clock.tick(30)
pygame.quit()

5.事件處理

其實(shí)通過上面的代碼例子中,細(xì)心的人應(yīng)該注意到有一個(gè)pygame.event.get()方法,它就是獲取鼠標(biāo)事件,而且通過事件對象的`type`屬性可以判定事件類型,再通過`pos`屬性就可以獲得鼠標(biāo)點(diǎn)擊的位置。

總結(jié) 

這里只是簡單的介紹pygame的使用,要想了解更多pygame知識,推薦pygame的官方網(wǎng)站,但要求要有一定的英文基礎(chǔ)哈哈哈哈哈~。其實(shí)我們學(xué)習(xí)這些模塊,不但要了解怎么使用他們,更重要的是要掌握面向?qū)ο蟪绦蛟O(shè)計(jì)和事件驅(qū)動(dòng)的思想去解決現(xiàn)實(shí)中的問題。

到此這篇關(guān)于Python圖形用戶界面與游戲開發(fā)的文章就介紹到這了,更多相關(guān)Python圖形用戶界面與游戲開發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于Pycharm亂碼解決大全

    關(guān)于Pycharm亂碼解決大全

    這篇文章主要介紹了關(guān)于Pycharm亂碼解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 如何通過神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)線性回歸的擬合

    如何通過神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)線性回歸的擬合

    這篇文章主要介紹了如何通過神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)線性回歸的擬合問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Python 中星號(*)的用法小結(jié)

    Python 中星號(*)的用法小結(jié)

    星號??*?? 往往被稱為乘法運(yùn)算符,是所有程序中最為常用的運(yùn)算符號之一,在Python 中,星號還有很多隱藏的強(qiáng)大功能, 本文將用最容易理解的例子來解釋星號*的 五個(gè)使用場景,從初級用法到高階用法,感興趣的朋友可以參考下
    2023-08-08
  • Flask添加路由的三種方法

    Flask添加路由的三種方法

    Flask 是一個(gè)流行的 Python Web 框架,它提供了多種方法來添加路由,本文詳細(xì)的介紹了Flask添加路由的三種方法,感興趣的可以了解一下
    2023-11-11
  • Python快速從視頻中提取視頻幀的方法詳解

    Python快速從視頻中提取視頻幀的方法詳解

    本文為大家介紹一種從視頻中抽取視頻幀的方法,由于單線程抽取視頻幀速度較慢,因此這里我們增加了多線程的方法,感興趣的小伙伴可以動(dòng)手嘗試一下
    2022-07-07
  • python數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)類型

    python數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)類型

    這篇文章主要介紹了python數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)類型,在?Python?以及其他所有面向?qū)ο缶幊陶Z言中,類都是對數(shù)據(jù)的構(gòu)成(狀態(tài))以及數(shù)據(jù)?能做什么(行為)的描述,下面我們就來你看看python數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)類型商務(wù)詳細(xì)介紹,需要的小伙伴可以參考一下
    2021-12-12
  • python Matplotlib數(shù)據(jù)可視化(2):詳解三大容器對象與常用設(shè)置

    python Matplotlib數(shù)據(jù)可視化(2):詳解三大容器對象與常用設(shè)置

    這篇文章主要介紹了python Matplotlib三大容器對象與常用設(shè)置的相關(guān)資料,幫助大家更好的學(xué)習(xí)和使用Matplotlib庫的用法,感興趣的朋友可以了解下
    2020-09-09
  • 在Python中使用第三方模塊的教程

    在Python中使用第三方模塊的教程

    這篇文章主要介紹了在Python中使用第三方模塊的教程,是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-04-04
  • 如何基于OpenCV&Python實(shí)現(xiàn)霍夫變換圓形檢測

    如何基于OpenCV&Python實(shí)現(xiàn)霍夫變換圓形檢測

    最近開始學(xué)習(xí)opencv,想檢測圖片上的圓環(huán),發(fā)現(xiàn)霍夫變換可以做這樣的效果出來,于是嘗試用霍夫變換做了下圓環(huán)檢測,這篇文章主要給大家介紹了基于OpenCV&Python實(shí)現(xiàn)霍夫變換圓形檢測的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • 一文搞懂Python中subprocess模塊的使用

    一文搞懂Python中subprocess模塊的使用

    subprocess是子流程,即進(jìn)程的意思,該模塊可以啟動(dòng)一個(gè)新進(jìn)程,并連接到它們的輸入/輸出/錯(cuò)誤管道,從而獲取返回值。本文將和大家聊聊subprocess模塊的使用,需要的可以參考一下
    2022-11-11

最新評論

会宁县| 施秉县| 邵阳市| 崇文区| 乌兰浩特市| 大兴区| 张北县| 长武县| 元朗区| 荃湾区| 谢通门县| 都昌县| 大兴区| 陇西县| 嘉义市| 元阳县| 江达县| 昆明市| 河源市| 兴安县| 漳平市| 承德市| 湄潭县| 东乡县| 海城市| 蓝田县| 尤溪县| 神木县| 永城市| 榆林市| 洪泽县| 凤冈县| 琼中| 花垣县| 松阳县| 贡山| 玉溪市| 大厂| 正安县| 门源| 乌拉特后旗|