網站首頁 編程語言 正文
前言
對于使用過計算機的人,應該對圖形用戶界面(GUI)應該都不會太陌生,這里就不在贅述。那么對于python這樣的動態語言有沒有GUI相關的庫呢?答案是肯定有的,那么常見的有哪些呢?主要有tkinter、wxPython、PyQt、PyGTK等模塊,而tkinter是python默認的模塊,沒有功能特別強大的GUI控件,所以真的要在python中進行GUI開發,推薦使用wxPython、PyQt、PyGTK等模塊。Pyhton還提供了Pygame游戲開發模塊。下面主要介紹tkinter、wxPython、Pygame的使用,廢話不多說直接開始吧,哈哈哈哈哈~
基于tkinter模塊的GUI
tkinter是基于Tk工具包的一個模塊,而Tk為控件的擺放提供了三種布局管理器,通過布局管理器可以對控件進行定位,這三種布局管理器分別是:
Placer:開發者提供控件的大小和擺放位置
Packer:自動將控件填充到合適的位置
Grid:基于網格坐標來擺放控件
講了這些還是不知道tkinter怎么使用,那么我們直接介紹使用tkinter來開發GUI的基本步驟:
導入tkinter模塊中我們需要的東西
創建一個頂層窗口對象并用它來承載整個GUI應用
在頂層窗口對象上添加GUI組件
通過代碼將這些GUI組件的功能組織起來
進入主事件循環(main loop)
基于wxPython模塊的GUI
wxPython是一個Python包裝wxWidgets(c++編寫)的一個流行的跨平臺的GUI工具包,可以作為Python的一個擴展模塊。wxObject類是wxPython API的核心模塊,它是所有類的基礎類,包括所有GUI應用程序使用的部件。如wx.Button,wx.StaicText等。
Pygame游戲開發
Pygame是一個開源的Python模塊,專門用于多媒體應用(如電子游戲)的開發,其中包含對圖像、聲音、視頻、事件、碰撞等的支持。Pygame的使用基本步驟:
導入Pygame模塊
先初始化
構建一個窗口
設置標題
讓其保持運行狀態,直到用戶手動關閉
先檢測事件,如果檢測到關閉按鈕那么就退出
下面從五方面來介紹Pygame的使用:
1.在游戲窗口中繪圖
我們可以通過Pygame中的draw模塊在游戲窗口中繪制各種圖形,主要包括:線條、矩形、多邊形、圓、橢圓、圓弧等。但最重要想說的不是這個,而是“屏幕坐標系”。什么是屏幕坐標系,它就是指將屏幕左上角設置為坐標原點‘(0, 0)’,向右是x軸的正向,向下是y軸的正向,在表示位置或者設置尺寸的時候,我們默認的單位都是像素(像素概念)。說了那么多我們舉個例子更實際一些:
import pygame # 導入pygame模塊
def main():
# 初始化pygame模塊
pygame.init()
# 初始化顯示窗口并設置窗口尺寸
screen = pygame.display.set_mode((888, 666))
# 設置當前窗口的標題
pygame.display.set_caption('888666')
# 設置窗口背景色
screen.fill((200, 102, 22))
# 繪制一個圓(參數分別是: 屏幕, 顏色, 圓心位置, 半徑, 0表示填充圓)
pygame.draw.circle(screen, (255, 0, 0,), (100, 100), 30, 0)
# 刷新當前窗口(渲染窗口將繪制的圖像呈現出來)
pygame.display.flip()
running = True
# 開啟一個事件循環處理發生的事件
while running:
# 從消息隊列中獲取事件并對事件進行處理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if __name__ == '__main__':
main()
2.圖形的處理
如果需要直接加載圖像到窗口上,可以使用pygame中image模塊的函數來加載圖像,再通過之前獲得的窗口對象的`blit`方法渲染圖像,代碼如下:
import pygame
WIN_WIDTH = 800
WIN_HEIGHT = 800
#初始化
pygame.init()
#構建游戲窗口
chuangkou = pygame.display.set_mode((WIN_WIDTH,WIN_HEIGHT))
#設置游戲標題
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() #再次刷新
# 開啟一個事件循環處理發生的事件
while True:
for x in pygame.event.get():
if x .type==pygame.QUIT:
exit()
3.動畫效果
動畫效果其實就是把不連續的圖片連續的播放,只要每秒鐘達到了一定的幀數,那么就可以做出比較流暢的動畫效果,代碼如下:
import pygame
WIN_WIDTH = 800
WIN_HEIGHT = 800
#初始化
pygame.init()
#構建游戲窗口
chuangkou = pygame.display.set_mode((WIN_WIDTH,WIN_HEIGHT))
#設置游戲標題
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 #初始化旋轉的角度
# 開啟一個事件循環處理發生的事件
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.碰撞檢測
在游戲中會有很多對象出現,而這些對象之間的“碰撞”在所難免,比如炮彈擊中了飛機、箱子撞到了地面等。碰撞檢測在絕大多數的游戲中都是一個必須得處理的至關重要的問題,pygame的sprite(動畫精靈)模塊就提供了對碰撞檢測的支持。通常情況下,我們使用該模塊的基類 Sprite 來創建一個子類,從而達到處理精靈的目的。當我們需要管理大量的精靈時,操作它們將變得復雜,此時通過構建精靈容器(group 類)也就是精靈組來統一管理這些精靈。構建方法如下:
group = pygame.sprite.Group()?# 創建精靈組
group.add(sprite_one) # 向組內添加一個精靈
此同時pygame.sprite模塊也提供了多種檢測精靈是否碰撞的方法,如下所示:
方法 | 說明 |
---|---|
pygame.sprite.collide_rect() | 兩個精靈之間的矩形檢測,即矩形區域是否有交匯,返回一個布爾值 |
pygame.sprite.collide_circle()? | 兩個精靈之間的圓形檢測,即圓形區域是否有交匯,返回一個布爾值 |
pygame.sprite.collide_mask() | 兩個精靈之間的像素蒙版檢測,更為精準的一種檢測方式 |
pygame.sprite.spritecollide() | 精靈和精靈組之間的矩形碰撞檢測,一個組內的所有精靈會逐一地對另外一個單個精靈進行碰撞檢測,返回值是一個列表,包含了發生碰撞的所有精靈 |
pygame.sprite.spritecollideany() | 精靈和精靈組之間的矩形碰撞檢測,上述函數的變體,當發生碰撞時,返回組內的一個精靈,無碰撞發生時,返回 None |
pygame.sprite.groupcollide() | 檢測在兩個組之間發生碰撞的所有精靈,它返回值是一個字典,將第一組中發生碰撞的精靈作為鍵,第二個組中發生碰撞的精靈作為值 |
說了那么多關于pygame.sprite碰撞檢測的函數,下面我們舉個例子來得更直觀一點:
import sys, pygame
from random import *
class MyClass(pygame.sprite.Sprite):
def __init__(self, image_file, location, speed):
pygame.sprite.Sprite.__init__(self) #初始化動畫精靈
self.image = pygame.image.load(image_file) #加載圖片
self.rect = self.image.get_rect() #得到定義圖像邊界矩形
self.rect.left, self.rect.top = location #設置球的初始位置
self.speed = speed #創建一個速度
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)
#設置窗口大小和顏色
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() #創建精靈組
#將球增加到列表
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])] #讓每個球變得隨機性
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.事件處理
其實通過上面的代碼例子中,細心的人應該注意到有一個pygame.event.get()方法,它就是獲取鼠標事件,而且通過事件對象的`type`屬性可以判定事件類型,再通過`pos`屬性就可以獲得鼠標點擊的位置。
總結?
這里只是簡單的介紹pygame的使用,要想了解更多pygame知識,推薦pygame的官方網站,但要求要有一定的英文基礎哈哈哈哈哈~。其實我們學習這些模塊,不但要了解怎么使用他們,更重要的是要掌握面向對象程序設計和事件驅動的思想去解決現實中的問題。
原文鏈接:https://blog.csdn.net/sanylove/article/details/123743852
相關推薦
- 2022-05-21 服務發現與負載均衡機制Service實例創建_服務器其它
- 2022-07-10 Spring依賴注入的幾種方式詳解
- 2022-03-26 .NET?6中使用DateOnly和TimeOnly類型_ASP.NET
- 2022-08-18 Android顏色處理SweepGradient掃描及梯度渲染示例_Android
- 2023-06-13 C++?ncnn模型驗證精度實現代碼_C 語言
- 2022-08-15 初步了解MyBatis的相關配置
- 2022-06-27 ABP引入Dapper框架的創建使用_實用技巧
- 2022-11-04 關于docker部署服務時ip無法訪問服務正常的問題_docker
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支