0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Kivy :開(kāi)源跨平臺(tái)的Python 框架

科技綠洲 ? 來(lái)源:Python實(shí)用寶典 ? 作者:Python實(shí)用寶典 ? 2023-10-31 15:27 ? 次閱讀

好久沒(méi)有寫(xiě)游戲系列教程了,今天恰好瀏覽到了 Kivy 這個(gè)開(kāi)源跨平臺(tái)的Python 框架,它能用于開(kāi)發(fā)多點(diǎn)觸控的用戶界面程序,允許快速簡(jiǎn)單的交互設(shè)計(jì),非常方便,于是有了制作本教程的想法。

本教程將教你如何使用 Kivy 編寫(xiě)一款乒乓球游戲。我們將從一個(gè)基本的應(yīng)用程序開(kāi)始,描述創(chuàng)建這個(gè)游戲的每個(gè)步驟。

Kivy 是用 Python 和 Cython 編寫(xiě)的,基于 OpenGL ES 2,支持各種輸入設(shè)備并擁有豐富的部件庫(kù)。使用相同的代碼,你可直接實(shí)現(xiàn)多平臺(tái)應(yīng)用,包括 Windows、macOS、Linux、AndroidiOS。所有 Kivy 部件都支持多點(diǎn)觸控。

1.準(zhǔn)備

開(kāi)始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上,如果沒(méi)有,可以訪問(wèn)這篇文章:超詳細(xì)Python安裝指南 進(jìn)行安裝。

**(可選1) **如果你用Python的目的是數(shù)據(jù)分析,可以直接安裝Anaconda:Python數(shù)據(jù)分析與挖掘好幫手—Anaconda,它內(nèi)置了Python和pip.

**(可選2) **此外,推薦大家用VSCode編輯器,它有許多的優(yōu)點(diǎn):Python 編程的最好搭檔—VSCode 詳細(xì)指南。

請(qǐng)選擇以下任一種方式輸入命令安裝依賴

  1. Windows 環(huán)境 打開(kāi) Cmd (開(kāi)始-運(yùn)行-CMD)。
  2. MacOS 環(huán)境 打開(kāi) Terminal (command+空格輸入Terminal)。
  3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install kivy[base] kivy_examples

2.簡(jiǎn)單使用 Kivy

這一節(jié)將簡(jiǎn)單介紹Kivy的基本使用,首先為我們游戲創(chuàng)建一個(gè)目錄和一個(gè)名為main.py的文件:

# main.py
from kivy.app import App
from kivy.uix.widget import Widget


class PongGame(Widget):
    pass


class PongApp(App):
    def build(self):
        return PongGame()


if __name__ == '__main__':
    PongApp().run()

在命令行中輸入 python main.py 運(yùn)行該應(yīng)用程序。它應(yīng)該只顯示一個(gè)黑色的窗口。所以我們所做的只是創(chuàng)建一個(gè)非常簡(jiǎn)單的Kivy應(yīng)用程序,它創(chuàng)建了一個(gè) PongGame Widget 類的實(shí)例,并將其作為應(yīng)用程序用戶界面的根元素返回。

在這一點(diǎn)上你應(yīng)該把它想象成一個(gè) Widget 的分層樹(shù)。Kivy 將這個(gè) Widget 放在默認(rèn)的窗口中。在下一步,我們將通過(guò)定義 PongGame 小部件的外觀來(lái)繪制Pong的背景和游戲分?jǐn)?shù)。

3.Kivy - 添加簡(jiǎn)單圖形

我們將使用一個(gè) .kv 文件來(lái)定義 PongGame 類的外觀。由于我們的應(yīng)用程序類被稱為 PongApp,我們可以簡(jiǎn)單地在同一目錄下創(chuàng)建一個(gè)名為 pong.kv 的文件,當(dāng)應(yīng)用程序運(yùn)行時(shí)將會(huì)自動(dòng)加載。

因此,為了定義游戲的外觀,我們創(chuàng)建一個(gè)名為 pong.kv 的新文件并添加以下內(nèi)容:

#:kivy 1.0.9

 PongGame >:
    canvas:
        Rectangle:
            pos: self.center_x - 5, 0
            size: 10, self.height
            
    Label:
        font_size: 70
        center_x: root.width / 4
        top: root.top - 50
        text: "0"
        
    Label:
        font_size: 70
        center_x: root.width * 3 / 4
        top: root.top - 50
        text: "0"

注意一個(gè)常見(jiàn)錯(cuò)誤:kv文件的名稱,例如 pong.kv,必須與應(yīng)用程序的名稱一致,例如 PongApp(App結(jié)尾之前的部分)。

如果你現(xiàn)在運(yùn)行這個(gè)應(yīng)用程序,你應(yīng)該看到中間有一個(gè)豎條,還有兩個(gè)零,那里將顯示玩家的分?jǐn)?shù),如下所示:

圖片

可以看到,在第一行,我們有:

#:kivy 1.0.9

每個(gè) kv 文件都需要第一行。它應(yīng)該以 #:kivy 及一個(gè)空格開(kāi)頭,然后是它要使用的 Kivy 版本(因此 Kivy 可以確保您至少擁有所需的版本,或者稍后處理向后兼容性)。

再往下看 kv 文件里定義了三個(gè)元素,一個(gè) canvas 和兩個(gè) label。

先說(shuō)說(shuō)兩個(gè)label,他們代表的是左右兩個(gè)數(shù)字,設(shè)定了 font_size(字體大小), center_x(中心位置), top(離頂部距離), text(文本),此外可以看到 root.width 和 root.top 的使用,這樣寫(xiě)的好處是能跟跟隨窗口寬度和高度的變化而變化。

另一個(gè)元素 canvas,它的下面定義了 Rectangle 參數(shù),意思是我們向畫(huà)布添加一個(gè)矩形。將矩形的 pos 設(shè)置為小部件水平中心左側(cè) 5 個(gè)像素,y 設(shè)置為 0,這就定義了矩形的顯示位置。

矩形的大小 size 設(shè)置為寬度為 10 像素,高度為小部件的高度。像這樣定義圖形的好處是,當(dāng)值表達(dá)式中使用的任何小部件的屬性發(fā)生變化時(shí),渲染的矩形將自動(dòng)更新。

4. Kivy - 增加乒乓球球體

好了,我們有一個(gè)基本的乒乓球場(chǎng)(雖然很簡(jiǎn)陋),但我們?nèi)匀恍枰蚺暮鸵粋€(gè)球來(lái)打球。讓我們從球開(kāi)始。我們將添加一個(gè)新的 PongBall 類來(lái)創(chuàng)建一個(gè)小部件,它將成為我們的球并使它彈跳起來(lái)。

PongBall 類:

class PongBall(Widget):

    # velocity of the ball on x and y axis
    velocity_x = NumericProperty(0)
    velocity_y = NumericProperty(0)

    # referencelist property so we can use ball.velocity as
    # a shorthand, just like e.g. w.pos for w.x and w.y
    velocity = ReferenceListProperty(velocity_x, velocity_y)

    # ``move`` function will move the ball one step. This
    # will be called in equal intervals to animate the ball
    def move(self):
        self.pos = Vector(*self.velocity) + self.pos

白球的 kv 配置如下:

 PongBall >:
    size: 50, 50
    canvas:
        Ellipse:
            pos: self.pos
            size: self.size

為了使這一切順利進(jìn)行,你還必須為球體增加所用的Property屬性類。下面是這一步更新后的python代碼和kv文件。

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty, ReferenceListProperty
from kivy.vector import Vector


class PongBall(Widget):
    velocity_x = NumericProperty(0)
    velocity_y = NumericProperty(0)
    velocity = ReferenceListProperty(velocity_x, velocity_y)

    def move(self):
        self.pos = Vector(*self.velocity) + self.pos


class PongGame(Widget):
    pass


class PongApp(App):
    def build(self):
        return PongGame()


if __name__ == '__main__':
    PongApp().run()

kv文件如下:

#:kivy 1.0.9

 PongBall >:
    size: 50, 50
    canvas:
        Ellipse:
            pos: self.pos
            size: self.size

 PongGame >:
    canvas:
        Rectangle:
            pos: self.center_x - 5, 0
            size: 10, self.height
    
    Label:
        font_size: 70
        center_x: root.width / 4
        top: root.top - 50
        text: "0"
        
    Label:
        font_size: 70
        center_x: root.width * 3 / 4
        top: root.top - 50
        text: "0"
    
    PongBall:
        center: self.parent.center

5. kivy - 增加乒乓球體運(yùn)動(dòng)

現(xiàn)在我們的目的是讓這個(gè)球動(dòng)起來(lái),因此必須定期調(diào)用 move 函數(shù)讓他動(dòng)起來(lái)。使用 Kivy 提供的 Clock 函數(shù)可以輕易地做到這一點(diǎn):

Clock.schedule_interval(game.update, 1.0/60.0)

這一行將導(dǎo)致游戲?qū)ο蟮母潞瘮?shù)每秒被調(diào)用60次。

不過(guò)我們還有一個(gè)問(wèn)題。我們想確保PongBall的移動(dòng)函數(shù)被定期調(diào)用,但是在我們的代碼中沒(méi)有任何對(duì)球?qū)ο蟮囊?,因?yàn)槲覀冎皇峭ㄟ^(guò) kv 文件在 PongGame 類的 kv 規(guī)則中添加了它。

由于我們要做的不僅僅是移動(dòng)球(比如把球從墻上彈下來(lái),然后再?gòu)椀角騿T的球拍上),我們可能需要為我們的PongGame類建立一個(gè)更新方法。

class PongGame(Widget):

    def update(self, dt):
        # call ball.move and other stuff
        pass

class PongApp(App):

    def build(self):
        game = PongGame()
        Clock.schedule_interval(game.update, 1.0/60.0)
        return game

然而,這仍然不能改變我們沒(méi)有對(duì)kv規(guī)則所創(chuàng)建的 PongBall 進(jìn)行操作的這一事實(shí)。為了解決這個(gè)問(wèn)題,我們可以給PongGame類添加一個(gè)ObjectProperty,并將其與kv規(guī)則中創(chuàng)建的widget掛鉤。

一旦這樣做了,我們就可以很容易地在更新方法中引用球的屬性,甚至可以讓它從邊緣彈起。

class PongGame(Widget):
    ball = ObjectProperty(None)

    def update(self, dt):
        self.ball.move()

        # bounce off top and bottom
        if (self.ball.y < 0) or (self.ball.top > self.height):
            self.ball.velocity_y *= -1

        # bounce off left and right
        if (self.ball.x < 0) or (self.ball.right > self.width):
            self.ball.velocity_x *= -1

在kv文件中將其與代碼中設(shè)定的 id: ball 映射起來(lái):

 PongGame >:
    ball: pong_ball

    # ... (canvas and Labels)

    PongBall:
        id: pong_ball
        center: self.parent.center

6. Kivy - 球拍移動(dòng)事件

現(xiàn)在,我們的球正在彈來(lái)彈去。唯一缺少的是可移動(dòng)的球拍和對(duì)分?jǐn)?shù)的跟蹤。我們不會(huì)再去討論創(chuàng)建類和kv規(guī)則的所有細(xì)節(jié),因?yàn)檫@些概念已經(jīng)在前面的步驟中涵蓋了。

相反,讓我們把重點(diǎn)放在如何響應(yīng)用戶的輸入而移動(dòng)球拍上。你可以在Python實(shí)用寶典公眾號(hào)后臺(tái)回復(fù):乒乓球 獲得全部代碼和kv規(guī)則。

在Kivy中,小部件可以通過(guò)實(shí)現(xiàn) on_touch_down、on_touch_move和on_touch_up 方法對(duì)輸入做出反應(yīng)。默認(rèn)情況下,Widget類實(shí)現(xiàn)這些方法時(shí),只是在其子部件上調(diào)用相應(yīng)的方法來(lái)傳遞事件,直到其中一個(gè)子部件返回True。

乒乓運(yùn)動(dòng)是非常簡(jiǎn)單的。球拍只需要向上和向下移動(dòng)。事實(shí)上,它是如此簡(jiǎn)單,我們甚至不需要讓球員小部件自己處理事件。我們只需為PongGame類實(shí)現(xiàn)on_touch_move函數(shù):

def on_touch_move(self, touch):
    if touch.x < self.width/3:
        self.player1.center_y = touch.y
    if touch.x > self.width - self.width/3:
        self.player2.center_y = touch.y

我們將在NumericProperty中保留每個(gè)球員的分?jǐn)?shù)。PongGame的分?jǐn)?shù)標(biāo)簽通過(guò)改變 NumericProperty score來(lái)保持更新,這反過(guò)來(lái)又會(huì)更新PongGame的子標(biāo)簽文本屬性。

這是如何實(shí)現(xiàn)的?因?yàn)镵ivy屬性會(huì)自動(dòng)綁定到其對(duì)應(yīng)的kv文件中的任何引用。當(dāng)球從兩側(cè)逃出時(shí),我們將通過(guò)PongGame類中的更新方法來(lái)更新分?jǐn)?shù)并再次發(fā)球。

PongPaddle類也實(shí)現(xiàn)了一個(gè) bounce_ball 方法,這樣球就會(huì)根據(jù)它擊中球拍的位置而產(chǎn)生不同方向的彈跳,非常有意思。下面是PongPaddle類的代碼:

class PongPaddle(Widget):

    score = NumericProperty(0)

    def bounce_ball(self, ball):
        if self.collide_widget(ball):
            speedup = 1.1
            offset = 0.02 * Vector(0, ball.center_y-self.center_y)
            ball.velocity = speedup * (offset - ball.velocity)

圖片

到這一步我們基本就完成了整個(gè)游戲的制作,如何,你心動(dòng)了嗎?

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 開(kāi)源
    +關(guān)注

    關(guān)注

    3

    文章

    3366

    瀏覽量

    42552
  • 編輯器
    +關(guān)注

    關(guān)注

    1

    文章

    806

    瀏覽量

    31199
  • 數(shù)據(jù)分析
    +關(guān)注

    關(guān)注

    2

    文章

    1451

    瀏覽量

    34074
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4797

    瀏覽量

    84786
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    物聯(lián)網(wǎng)平臺(tái)機(jī)智云Android開(kāi)源框架入門(mén)之旅

    開(kāi)源框架:是開(kāi)源的適用于物聯(lián)網(wǎng)的軟件框架,用于無(wú)縫的支持設(shè)備到設(shè)備的互聯(lián)。。機(jī)智云目前提供3套SDK:iOS平臺(tái)原生SDK、Android
    發(fā)表于 11-09 14:37

    五大Python Web框架詳解

    使用框架,可以讓程序員以更少的代碼實(shí)現(xiàn)自定義功能,還可以將更多的精力集中在業(yè)務(wù)邏輯上,更加的輕松便利!2018年主流的Python框架有以下5種:1.DjangoDjango是一個(gè)開(kāi)源
    發(fā)表于 02-06 17:17

    哪些平臺(tái)支持Python?

    支持常見(jiàn)的主流平臺(tái),如AIX、HPUX、Solaris、Linux、Windows等,除Windows外常見(jiàn)的Unix、Linux平臺(tái)均帶有原生的Python,但版本一般較低。關(guān)于
    發(fā)表于 06-05 16:41

    Python技術(shù)學(xué)習(xí)之Django框架設(shè)計(jì)思想

    運(yùn)算、人工智能、系統(tǒng)運(yùn)維、金融以及圖像GUI等領(lǐng)域,Django框架Python Web開(kāi)發(fā)中常用的后臺(tái)框架。Django是用python語(yǔ)言寫(xiě)的
    發(fā)表于 06-15 15:01

    Python 界面工具--Kivy 初嘗試

    ivy是一個(gè)開(kāi)源工具包能夠讓使用相同源代碼創(chuàng)建的程序能平臺(tái)運(yùn)行。它主要關(guān)注創(chuàng)新型用戶界面開(kāi)發(fā),如:多點(diǎn)觸摸應(yīng)用程序。Kivy還提供一個(gè)多點(diǎn)觸摸鼠標(biāo)模擬器,
    發(fā)表于 06-18 15:35

    開(kāi)源技術(shù)平臺(tái)介紹

    物聯(lián)網(wǎng)正在快速發(fā)展。許多組織和公司推出了各自的開(kāi)源技術(shù)平臺(tái),這里對(duì)幾個(gè)影響力比較大的平臺(tái)做一下介紹。AllJoynAllJoyn是一個(gè)由Allseen聯(lián)盟贊助的開(kāi)源軟件
    發(fā)表于 08-20 07:21

    oneOS框架基礎(chǔ)及應(yīng)用

    oneOS框架基礎(chǔ)及應(yīng)用1. 為什么引入oneos2. Oneos平臺(tái)3. Oneos系統(tǒng)4. Python開(kāi)發(fā)5. 軟件開(kāi)發(fā)1、為什么引入oneos1.1 需求嵌入式軟件開(kāi)發(fā)是針對(duì)特定的硬件系統(tǒng)
    發(fā)表于 02-17 07:53

    Qt 平臺(tái)C++圖形用戶界面應(yīng)用程序開(kāi)發(fā)框架

    Qt是一個(gè)1991年由Qt Company開(kāi)發(fā)的平臺(tái)C++圖形用戶界面應(yīng)用程序開(kāi)發(fā)框架。它既可以開(kāi)發(fā)GUI程序,也可用于開(kāi)發(fā)非GUI程序,比如控制臺(tái)工具和服務(wù)器。Qt是面向?qū)ο蟮?b class='flag-5'>框架
    發(fā)表于 03-28 21:03

    資訊速遞 | ArkUI-X 預(yù)覽版已正式開(kāi)源!

    OpenHarmony項(xiàng)目群技術(shù)指導(dǎo)委員會(huì)(以下簡(jiǎn)稱“TSC”)-平臺(tái)應(yīng)用開(kāi)發(fā)框架TSG所孵化項(xiàng)目 —— ArkUI-X,近期已正式開(kāi)源 ,開(kāi)發(fā)者基于一套主代碼,就可以將在OpenH
    發(fā)表于 08-11 16:10

    平臺(tái)的游戲開(kāi)發(fā)框架LibGDX的介紹

    LibGDX是一個(gè)平臺(tái)的游戲開(kāi)發(fā)框架,適用于Windows,Linux,Mac OS X,Android,iOS和支持WebGL的瀏覽器。
    的頭像 發(fā)表于 11-06 07:30 ?3230次閱讀

    一文詳細(xì)了解APACHE SPARK開(kāi)源框架

    Apache Spark 是一個(gè)開(kāi)源框架,適用于集群計(jì)算機(jī)并行處理大數(shù)據(jù)任務(wù)。它是在全球廣泛應(yīng)用的分布式處理框架之一。
    的頭像 發(fā)表于 04-19 14:22 ?2207次閱讀

    2023年Python GUI桌面應(yīng)用開(kāi)發(fā)該選哪個(gè)庫(kù)

    當(dāng)前主流的Python GUI庫(kù)主要有PyQT5、TKinter、Pyside、PyQT5/PySide+QML、Kivy、PySimpleGUI等,PyQT5是它們當(dāng)中絕對(duì)的佼佼者,它基于著名的Qt框架構(gòu)建,擁有眾多開(kāi)發(fā)者社區(qū)
    的頭像 發(fā)表于 01-30 11:57 ?1730次閱讀

    如何使用 Kivy 編寫(xiě)一款乒乓球游戲

    好久沒(méi)有寫(xiě)游戲系列教程了,今天恰好瀏覽到了 Kivy 這個(gè)開(kāi)源平臺(tái)Python 框架,它能用
    的頭像 發(fā)表于 10-21 14:36 ?596次閱讀
    如何使用 <b class='flag-5'>Kivy</b> 編寫(xiě)一款乒乓球游戲

    邊緣計(jì)算平臺(tái)開(kāi)源框架有哪些類型

    邊緣計(jì)算平臺(tái)開(kāi)源框架是指基于邊緣計(jì)算概念開(kāi)發(fā)的開(kāi)源軟件框架,用于構(gòu)建和管理邊緣計(jì)算平臺(tái)。這些
    的頭像 發(fā)表于 12-27 15:17 ?1337次閱讀

    Python自動(dòng)化測(cè)試框架及其應(yīng)用

    Pytest是一個(gè)非常成熟的全功能的Python測(cè)試框架,與python自帶的unittest測(cè)試框架類似,但是比unittest框架使用起
    的頭像 發(fā)表于 04-03 16:15 ?562次閱讀
    <b class='flag-5'>Python</b>自動(dòng)化測(cè)試<b class='flag-5'>框架</b>及其應(yīng)用