1. 程式人生 > >python----pygame圖形介面(太全了,收了)

python----pygame圖形介面(太全了,收了)

使用pygame.image.load讀取影象檔案。
img = pygame.image.load(filename)
可 以讀取檔名為filename的影象檔案,pygame會自動確定檔案的型別(比如GIF或者BMP),一般來說支援JPG、PNG、GIF (non animated)、BMP、PCX、TGA (uncompressed)、TIF、LBM (及PBM)、PBM (及PGM, PPM)、XPM等。它返回一個包含影象的Surface,Surface的格式和原來的檔案相同(包括顏色格式、透明色和alpha透明)。
使用pygame.image.save可以把影象儲存到檔案中。
pygame.image.save(img, filename)
這個函式可以把img這個Surface的內容儲存為filename指定的影象檔案,檔案格式可以是BMP、TGA、PNG或者JPEG。如果副檔名不認識,預設儲存為TGA格式。TGA和BMP格式都是非壓縮的檔案。
還有pygame.image.tostring、pygame.image.fromstring、pygame.image.frombuffer函式可以把影象序列化,即把影象儲存在字串中或者從字串中讀取影象。

變換
使用pygame.transform模組中的函式,可以對影象進行簡單的變換。所有的這些函式都需要一個Surface引數指明要處理的影象,並生成一個新的影象表示處理後的結果,原來的影象不會被改變。
使用pygame.transform.flip可以上下左右顛倒影象,比如
newimg = pygame.transform.flip(img, True, False)
第一個引數指定要翻轉的影象,第二個引數指定是否對影象進行左右顛倒,第三個引數指定是否對影象進行上下顛倒。函式返回顛倒後的影象。
使用pygame.transform.scale可以對影象進行縮放,比如
newimg = pygame.transform.resize(img, (640, 480))
第一個引數指定要縮放的影象,第二個引數指定縮放後的影象大小,函式返回縮放後的影象。
使用pygame.transform.rotate可以對影象進行旋轉,比如
newimg = pygame.transform.rotate(img, 30.0)
第一個引數指定要旋轉的影象,第二個引數指定旋轉的角度數,正值為逆時針旋轉,負值是順時針旋轉。函式返回旋轉後的影象。旋轉後的影象可能比原來的影象大,才能夠容納原來的整個影象,空出來的部分會補上透明色或者原來影象的左上角點的顏色。
使用pygame.transform.rotozoom可以對影象進行縮放並旋轉,比如
newimg = pygame.transform.rotozoom(img, 30.0, 2.0)
第一個引數指定要處理的影象,第二個引數指定旋轉的角度數,第三個引數指定縮放的比例。返回處理後的影象。這個函式和前面兩個函式不一樣,這個函式會對影象進行濾波處理,影象效果會更好,但是速度會慢很多。
使用pygame.transform.scale2x可以對影象進行快速的兩倍大小的放大,比如
newimg = pygame.transform.scale2x(img)

使用pygame.transform.chop可以對影象進行裁減,比如
newimg = pygame.transform.chop(img, (100, 100, 200, 200))
第一個引數指定要裁減的影象,第二個引數指定要保留的影象的區域。返回裁減後留下的影象。

對surface的控制

畫素格式
pygame裡的Surface是用來表示影象的物件。Surface有一定的大小和畫素格式。在建立的時候,可以指定。
pygame.Surface((width, height), flags=0, depth=0, masks=None): return Surfacepygame.Surface((width, height), flags=0, Surface): return Surface

如果是8bit畫素格式的Surface,它還會用一個調色盤對映到24位元顏色。畫素格式可以通過指定畫素深度或者已有的Surface來控制。flags標誌位引數是其他一些Surface選項的集合,你可以指定如下的標誌
HWSURFACE, 在視訊記憶體中建立影象 SRCALPHA, 畫素格式中會包含一個alpha通道
這些引數都僅僅是一個請求,在實際中可能並不能實現。高階使用者可以組合一組顏色遮蔽位,masks是4個整數的集合,表示畫素裡的哪個位用來表示一種顏色。一般的Surface不需要masks引數。
8bit的Surface有一個調色盤,把8bit的整數對映到RGB彩色。通過下面函式可以對調色盤進行設定:
Surface.set_at(index, RGB): return NoneSurface.set_palette([RGB, RGB, RGB, ...]): return None
通過下面的函式可以獲得當前的調色盤:
Surface.get_palette(): return [RGB, RGB, RGB, ...]Surface.get_palette_at(index): return RGB

不同畫素型別的Surface之間的blit操作是很慢的,所以一般在blit之前要先通過Surface.convert對影象進行畫素格式的變換。Surface.convert有多種不同的用法
Surface.convert(Surface): return SurfaceSurface.convert(depth, flags=0): return SurfaceSurface.convert(masks, flags=0): return SurfaceSurface.convert(): return Surface
新的畫素格式可以由現存其它Surface確定,也可以由depth,flags或者masks決定。這些引數和pygame.Surface的引數類似。
如果沒有引數,新的Surface會和display Surface的畫素格式一樣。這是畫圖最快的格式。轉換所有需要多次blit的Surface是一個好主意。
轉換出來的Surface不會有畫素alpha。如果原來的Surface裡面有,他們會被去掉。參看Surface.convert_alpha來保留或者建立每畫素alpha。
如果Surface是有alpha通道的,並且需要保留這個資訊,則需要使用Surface.convert_alpha:
Surface.convert_alpha(Surface): return SurfaceSurface.convert_alpha(): return Surface


塊複製
一個影象複製到另一個上面,這是遊戲中最常用的操作,由blit函式來實現
Surface.blit(source, dest, area=None, special_flags = 0): return Rect
畫的位置可以由dest引數指定。dest可以是一對座標值,表示源Surface的左上角在這個Surface上的座標。dest也可以是一個矩形,矩形的左上角作為blit的位置,而矩形的大小不影響blit。
有一個可選的area矩形引數,可以用來指定只畫源Surface的一部分。
一個可選的special_flags引數,可以是BLEND_ADD、BLEND_SUB、BLEND_MULT、BLEND_MIN、BLEND_MAX。將來也可能有其它特殊標記新增進來。
函式返回的矩形表示受影響的畫素的區域,不包括目標Surface以外的畫素,也不包括剪下區域以外的畫素。

透明
pygame支援三種類型 的透明:透明色(colorkey),Surface alpha和每畫素alpha。Surface alpha可以和透明色(colorkey)混合使用,但是有畫素alpha的影象不能夠使用其它模式。透明色(colorkey)讓一種顏色值透明。任 何和這個顏色相同的畫素都不會被畫出來。Surface alpha值是單獨一個值用來改變整個影象的透明度。Surface alpha值是255表示不透明,值是0表示全透明。而每畫素alpha是不一樣的,它為每個畫素儲存了一個透明值。這種方法允許精確的控制透明效果,但 是這種方法也是最慢的。每畫素alpha不能和其它方法混用。
要設定透明色,使用Surface.set_colorkey函式:
Surface.set_colorkey(Color, flags=0): return NoneSurface.set_colorkey(None): return None
當 把這個Surface blit到令一個Surface時候,和這個透明色顏色相同的畫素會變成透明。color引數可以是RGB顏色或者是一個對映的整數。如果傳送的是 None,則Surface會沒有透明色。如果是有每畫素透明的Surface,透明色會被忽略。透明色可以和Surface alpha混合使用。可選的flags引數可以是pygame.RLEACCEL,用來在沒有加速的時候提供更好的效能。設定了RLEACCEL的 Surface作為源Surface blit更快,但是修改Surface的內容會更慢。
Surface的當前透明色可以通過Surface.get_colorkey獲得:
Surface.get_colorkey(): return RGB or None
如果沒有透明色,則函式返回None。
要設定Surface的alpha值,可以通過Surface.set_alpha來實現:
Surface.set_alpha(value, flags=0): return NoneSurface.set_alpha(None): return None
透明值value可以取0到255之間的值,0是完全透明,255是完全不透明。如果value是None,則Surface就沒有alpha透明瞭。
Surface當前的alpha值可以通過Surface.get_alpha獲得:
Surface.get_alpha(): return int_value or None
如果沒有alpha透明,則這個函式返回None。
每畫素在繪圖的時侯可以通過顏色元組的第四個引數指定。

剪下區域
每個Surface包含一個剪下區域。預設情況下,剪下區域是整個Surface。如果改變了剪下區域,所有的畫圖操作都會限制在一個比較小的範圍之內。
通過Surface.set_clip可以設定剪下區域:
Surface.set_clip(rect): return NoneSurface.set_clip(None): return None
如果引數是None,則整個Surface都可以修改。剪下區域總是在Surface本身的區域只內的。如果剪下區域比Surface的區域大,則會自動縮小到Surface區域之內。
要獲得Surface的當前剪下區域,可以通過Surface.get_clip:
Surface.get_clip(): return Rect
一個Surface總是返回一個有效的矩形,不會超過影象的邊界範圍。如果Surface設定了None作為剪下區域,則Surface會返回整個Surface的區域。

鎖定
對於硬體加速的Surface,它有可能被存在顯示記憶體中。要訪問這些Surface上面的畫素,就必須先通過Surface.lock對畫素進行鎖定:
Surface.lock(): return None
鎖定完後,可以對Surface上的畫素進行操作,操作完成後,應該及時解鎖:
Surface.unlock(): return None
一個Surface是否要先鎖定再操作,可以通過Surface.mustlock來判斷:
Surface.mustlock(): return bool
這個函式返回Ture則需要鎖定,否則不需要鎖定。一個Surface當前的鎖定狀態可以通過Surface.get_locked來獲得:
Surface.get_locked(): return bool
這個函式返回True表示已經鎖定了,False表示沒有鎖定。
實 際上,pygame中所有需要鎖定Surface才能操作的函式都會自動地對Surface鎖定和解鎖。一般情況下不需要呼叫lock和unlock函 數。但是如果在一段程式碼中需要反覆對Surface上的畫素進行操作,則每次都進行鎖定和解鎖會非常的慢,所以可以在這一串操作開始的時候進行鎖定,這一 串操作結束後解鎖,避免重複的鎖定解鎖操作。

繪圖
除了可以把事先畫好的圖片blit到Surface上以外,還可以在Surface上自行在Surface上繪製一些簡單的圖形,比如點、線、方、圓等。這個功能主要由pygame.draw模組完成。
首先匯入pygame.draw模組。
import pygame.draw
如果已經用了import pygame,則pygame.draw模組也被自動匯入了。
然後準備好要在上面繪製圖形的Surface,比如
surface = pygame.display.set_mode((640, 480))


畫矩形
接下來就可以在surface上面繪製想要的圖形了。比如說畫矩形可以使用pygame.draw.rect函式:
pygame.draw.rect(surface, (0,0,255), (100, 200, 100, 100))
第一個引數指定在哪個Surface上畫矩形,第二個引數是矩形的顏色,第三個引數是矩形的位置和大小。
顏 色的引數一般是一個由紅綠藍三種顏色值構成的三元組,0是最暗的,255是最亮的。比如(0,0,255)是純藍色,(255,0,0)是純紅色, (0,0,0)是黑色,(255,255,255)是白色等等。有時候也可以使用RGBA四元組來表示顏色。如果Surface包含alpha,四元組中 alpha值會被直接寫入到Surface裡面,畫圖函式並不會進行透明的繪畫。顏色引數也可以是一個整數,是對映到Surface裡的畫素值。其他繪圖 函式裡面的顏色引數也是一樣的。
矩形引數由四個值構成的元組,分別是矩形左上角的x、y座標,矩形的寬和高。
預設情況下,畫出來的矩形是實心的(中間填充了指定的顏色)。如果要畫一個只有邊框的矩形,可以指定一個可選的引數width。比如
pygame.draw.rect(surface, (0,0,255), (100, 200, 100, 100), 2)
可以在螢幕上畫一個邊框是2個畫素粗的矩形,中間是透明的。如果不指定這個width引數,或者width指定為0,則畫出來的矩形就是實心的。其他有些繪圖函式裡面也有類似的引數,功能也是相似的。
pygame.draw.rect函式返回一個矩形,表示螢幕上被修改的畫素的區域範圍。其它繪圖函式也都有這樣的返回值。

畫多邊形
用pygame.draw.polygon可以在Surface上畫一個多邊形。比如
pygame.draw.polygon(surface, (255,0,0), [(100, 100),(200, 100),(250,186.6),(200,273.2),(100, 273.2),(50,186.6)])

第三個引數pointlist引數是多邊形頂點的列表。可選的第四個width引數是多邊形的邊的粗細。如果width是0或者被忽略,多邊形是被填充的。
pygame.draw.polygon(surface, (0,255,0), [(100, 100),(200, 100),(250,186.6),(200,273.2),(100, 273.2),(50,186.6)],1)


畫圓
pygame.draw.circle在Surface上畫一個圓形。
pygame.draw.circle(surface, (255,255,0), (100, 100), 50)
第三個引數pos是圓的圓心,第四個引數radius是半徑大小。可選的第五個引數width是圓邊的粗細,如果width預設或者是0圓會被填充。

畫橢圓
pygame.draw.ellipse在矩形區域中畫一個橢圓的形狀。比如
pygame.draw.ellipse(surface, (0,255,255), (200, 200, 200, 100))
第三個引數指定的矩形區域是橢圓填充的區域。可選的第四個引數width是邊的粗細。如果width預設或者是0,橢圓會被填充。

畫弧線
pygame.draw.arc畫橢圓的一段。比如
pygame.draw.arc(surface, (0,255,0), (200, 200, 200, 100), 3.14159/3, 3.14159*2/3)

在Surface上畫一個橢圓狀的弧線。第三個引數rect指定橢圓填充的矩形。接下來兩個角度引數指定起始和終止的角度(以弧度為單位),朝右為0度。可選的第六個引數width是弧線的粗細,預設值是1。
== 畫線段 == pygame.draw.line函式可以畫一條直線段。比如
pygame.draw.line(surface, (255,0,255), (100, 100), (200, 200))
第三個引數指定起點,第四個引數指定終點。可選的第五個引數width指定線的寬度,預設是1。線段終點沒有箭頭,寬的線段終點是方形的。

畫連續的線段
pygame.draw.lines畫多條連續的線段。比如
pygame.draw.lines(surface, (255,255,255), False, [(100, 100), (200, 200), (300, 200), (200, 100)])
第四個引數pointlist是一系列點的列表。如果第三個引數是True,則在最後一點和第一點之間會畫一條線段。可選的第五個引數表示線的寬度,預設為1。這個函式不會畫終點箭頭和中間連線頭。線段有尖銳的拐角,粗的線段會有不太好看的拐角。

抗鋸齒的線段
pygame.draw.aaline畫抗鋸齒的線段。
pygame.draw.aaline(surface, (255,255,0), (200, 100), (300, 200))
這個函式的用法和畫線段的函式差不多,只是畫出來的線段有抗鋸齒效果,看上去比較光滑。有一個可選的第五個引數blend,如果blend是True,則陰影部分是和原始畫素混合而不是直接覆蓋的。這個函式接受浮點數作為點的座標。
pygame.draw.aalines可以畫多條連續的抗鋸齒線段。
pygame.draw.aalines(surface, (0,0, 255), False, [(100, 100), (200, 200), (300, 100), (200, 0)])
如果第三個引數如果是True,則在第一個點和最後一點之間會畫一條直線。有一個可選的第五個引數blend,如果blend引數是True,則陰影部分是和原始畫素混合而不是直接覆蓋的。這個函式接受浮點數作為點的座標。

點操作
畫點的方法和其它方法不太一樣,用Surface.set_at方法完成畫點的操作,比如:
surface.set_at((100, 100), (255,255,255))
第一個引數是點的座標,第二個引數是顏色。在遊戲和實時模擬中,一次取得和設定一個畫素是很慢的。
除了可以在Surface上畫點,還可以用Surface.get_at讀取Surface上畫素的值。比如
color = surface.get_at((100, 100))
這個函式返回給定點的顏色值。

填充區域
Surface.fill方法可以用一種顏色填充一個矩形區域。比如
surface.fill((255,0,0), (100, 200, 100, 100))
第一個引數指定要填充的顏色,第二個引數指定填充的矩形區域。如果沒有給定第二個引數,整個Surface會被填充。第二個引數會限制備填充的區域。這個函式會返回受影響的Surface區域。

寫字
相對於在Surface上畫圖,在Surface上寫文字要複雜得多。
首先需要匯入pygame.font模組並初始化。
import pygame.fontpygame.font.init()


選擇字型
然後用pygame.font.get_fonts獲取可用的字型的列表。
pygame.font.get_fonts()
它返回一個字型名字的列表。
然後再用字型名字列表中的一個名字可以建立一個字型物件。
font = pygame.font.SysFont("monospace", 12)
第一個引數指定字型的名字,第二個引數指定字型的大小。可選的第三個引數bold指定是否粗體,預設不是粗題。可選的地四個引數italic指定是否斜體,預設不是斜體。
如果是要使用自己給的字型檔案,可以這樣建立字型物件
font = pygame.font.Font("/usr/share/fonts/truetype/arphic/uming.ttf", 12)
第一個引數指定要載入的字型檔案的完整路徑,第二個引數指定字型的大小。

建立文字Surface
使用字型物件的Font.render函式可以建立一個Surface,裡面包含寫出來的文字。比如
font_surface = font.render("Hello world!", False, (255,0,0))
第 一個引數是要寫的文字,文字只能包含一行,換行符不會被畫出來。第二個引數指定是否使用抗鋸齒效果,如果是True字元會有光滑的邊緣。第三個引數是字型 的顏色。可選的第四個引數background用來指定文字背景的顏色。如果沒有指定background,背景是透明的。返回建立的Surface,它 上面包含了畫出來的文字,它的大小是能容納這些字的最小的大小。
要在已有的Surface上寫字,只能先建立一個只包含文字的Surface,然後把它blit到已有的Surface上。比如:
surface.blit(font_surface, (100, 100))

相關推薦

python----pygame圖形介面()

使用pygame.image.load讀取影象檔案。 img = pygame.image.load(filename) 可 以讀取檔名為filename的影象檔案,pygame會自動確定檔案的型別(比如GIF或者BMP),一般來說支援JPG、PNG、GIF (non animated)、BMP、PCX、TG

Centos6安裝圖形介面(hdp不需要hdp直接從github上下載資料即可)

CentOS 6.5 安裝圖形介面 安裝的時候沒有安裝影象介面。安裝步驟如下: 1.yum -y groupinstall Desktop 2.yum -y groupinstall "X Window System" 3.init 5 由字元介面切換到圖形介面可用兩種簡單方法實現: 1、在字元介面

[python] 溜七牛雲圖片資源批量下載 && 自建圖床伺服器

故事背景: 七牛雲最近一波測試域名操作真是把我坑死了!這簡直和百度贈送你2T網盤,之後再限速一樣騷操作。於是,痛定思痛自己買個雲主機、自己搭圖床應用! 1、七牛圖片批量下載到本地 1.1 曲折嘗試 當測試連結不能用的時候,我想依次用到下面幾個方法嘗試download圖片: 用七牛之前的

[python] 溜七牛雲圖片資源批量下載 && 自建圖床伺服器

故事背景: 七牛雲最近一波測試域名操作真是把我坑死了!這簡直和百度贈送你2T網盤,之後再限速一樣騷操作。於是,痛定思痛自己買個雲主機、自己搭圖床應用! 1、七牛圖片批量下載到本地 1.1 曲折嘗試 當測試連結不能用的時候,我想依次用到下面幾個方法嘗試download圖片: 用七牛之前的傳圖工具qshel

(shell練習2)zenity圖形介面之進度條滑動塊輸入、警告、錯誤、顯示對話方塊

1,程式執行進度條(這個比較好玩,有時候需要檢視某個操作的進度,可以使用這種方法) #!/bin/bash #1,自建進度條 #進度條內上要顯示的內容 ( echo "50"; sleep 1 tar -zcvf aaa.tar.gz practice/*; sleep 1 echo "1

linux開機圖形介面出現螢幕閃爍打不開終端

背景:電腦安裝的是雙系統,進入ubuntu時,出現螢幕閃爍,無法使用滑鼠,也無法使用ctrl+alt+t開啟終端。 解決過程:考慮到前幾回開啟ubuntu時,提示過boot空間不足,應該是這個問題,然而現在命令列也不能使用,想起來以前使用過字元介面(命令列介面

python 實現圖形介面exe

需求:1)圖形介面小工具 2)exe檔案 3)對環境無依賴   之前大型的gui專案多用java實現,exe4j轉成exe檔案,缺點是執行此exe的人必須裝有java虛擬機器環境,或者吧jre達到exe會非常大,目前僅需要一個輕量級的小工具所以選擇技術如下。 1、pytho

要學的東西真的……

前一段時間主要的精力都放在德語的學習上了,因為不想再繼續在這上面耗費太多的時間了,所以提高了效率。最近在網上轉了一下,發現有很多新的過氣的技術都是不為我所知曉的,看來跟不上時代了。 ICMP的一個數據包都能給計算機開一個後門,ftp隧道技術(雖然有點兒幼稚)。 回想當年,從一

python圖形介面作圖工具

Python的圖形庫太全了,導致我現在都有點要轉到python麾下的衝動了。Graphical Representations of DataOver the years many different plotting modules and packages have be

ubuntu無法進入圖形介面——輸完密碼卡在那裡

問題補充: 看上去不是grub的我問題,已經進入系統裝載介面了,顯示面突然閃爍,貌似載入圖形介面不成功,然後轉入提示符介面。感覺像是驅動或者程式衝突導致的問題,大家有同樣的情況嗎? 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

PyGObject筆記1——用Python圖形介面

       Linux下最著名的圖形庫GTK+的較新版本GTK+不僅支援C語言,還綁定了多種語言,Python是其中繫結比較成熟的一種。        Python繫結GTK2為PyGTK,現在推薦使用繫結GTK3+的PyGObject替代PyGTK。       本篇開

python簡單圖形介面GUI入門——easygui

感覺gui做起來成就感比較高,學完基礎語言順便花一個下午看看GUI設計,現在回顧來看這個如果做正式的展示太過簡單,easygui只是小演示之用。 下載 首先是easygui包下載,兩種方式: 1)在python環境下,用pip3 install直接安裝 2)現

Python圖形介面

from tkinter import * class Application(Frame): def __init__(self,master=None): Frame.__init__(self,master) self.pack

async好用兩個小時寫的程式碼

/* 從5442網站上把所有的熱門推薦下載下來 async+cheerio+request */ const util = require('util'); const request = require('request'); const http = require

利用python圖形介面實現一些小工具

import easygui as g import sys import datetime import uuid import socket import psycopg2 import uuid nowTime=datetime.datetime.now

【maven】史上最教程必懂

一、為什麼使用Maven這樣的構建工具【why】 一個專案就是一個工程 如果專案非常龐大,就不適合使用package來劃分模

曹工說Spring Boot原始碼(26)-- 學習位元組碼也實在不能忍受個小小的位元組碼執行引擎

#曹工說Spring Boot原始碼(26)-- 學習位元組碼也太難了,實在不能忍受了,寫了個小小的位元組碼執行引擎 # 寫在前面的話 相關背景及資源: [曹工說Spring Boot原始碼(1)-- Bean Definition到底是什麼,附spring思維導圖分享](https://www.cnbl

下課

img args exception nis 目錄 類的方法 文件 use int 1 package com.mon11.day16.file; 2 3 import java.io.File; 4 import java.io.IOException;

子查詢一定要註意別忘記加TOP 1不然就GG好久測試給我測出來

date 子查詢 註意 string tde best ani rtm 測試 string sql = "select Code,DepartmentName" + ",(select top 1 Or

系統jvm的stack空間占滿爆出stackOverflow異常修改-Xss512k 參數來解決

tail huang -s support ini 一個bug 代碼 捕獲 creation 此bug的最大難題是,在debug啟動時就沒有問題了,在正常啟動時就報錯。有些人有這個問題,有些同學運行就沒有這個問題。這可麻煩了。朋友們以後可以以此為特征,診斷類似的問題。 **