使用 .kv 檔案在 Python Kivy 中操作按鈕


透過在 .kv 檔案中使用按鈕來設計 Kivy 應用的互動式使用者介面既簡單又有效。Kivy 是一個用於構建跨平臺應用程式的 Python 框架,它使用 .kv 檔案型別將按鈕的視覺外觀和功能與底層程式碼分開。.kv 檔案的宣告式語言用於提供按鈕屬性,例如文字、大小和事件處理程式,使開發人員能夠建立簡單、簡潔和易於管理的使用者介面。開發人員可以直接將按鈕新增到 .kv 檔案中,從而輕鬆更改按鈕的外觀和功能,而不會弄亂 Python 程式碼。

涵蓋主題

  • Python Kivy 功能

  • 按鈕簡介

  • 使用 Kivy 設計應用程式

Python Kivy 的特性

  • 使用者介面 (UI) 框架:為了建立互動式 UI,Kivy 提供了各種小部件和佈局管理器來滿足各種需求。它相容多種輸入方式,包括觸控手勢、滑鼠點選和鍵盤事件等等。

  • 多點觸控支援:Kivy 專為處理多點觸控互動而設計,因此它適用於智慧手機和平板電腦等觸控裝置。

  • 圖形和動畫:由於 Kivy 強大的圖形功能,開發人員可以建立具有流暢動畫和過渡的視覺上吸引人的應用程式。

  • 跨平臺開發:由於 Python Kivy 應用程式是真正的跨平臺應用程式,開發人員只需編寫一次程式碼,即可在多個平臺上使用,而無需進行重大更改。

  • 開源和社群驅動:一個充滿活力的開發人員和志願者社群不斷改進和發展 Kivy 開源專案。

  • 易於學習:Kivy 的語法簡單明瞭,尤其對於 Python 開發人員來說很容易理解。它使用宣告式方法構建使用者介面,因此初級和經驗豐富的開發人員都可以使用它。

按鈕簡介

Kivy 中的按鈕小部件是互動式小部件,它們記錄使用者輸入並在 Python 程式中啟動特定的操作或事件。它們允許使用者與應用程式互動,並且是使用者介面的重要組成部分。在大多數應用程式中,按鈕響應觸控、滑鼠點選、鍵盤移動等,並具有視覺表示,例如文字或影像。

在 Python 中,按鈕使用 Button 類表示,它是 Kivy 庫的一部分。它們可以使用宣告式語法在 .kv 檔案中宣告,也可以使用 Python 程式碼以程式設計方式宣告。開發人員可以使用 Button 類的眾多屬性和事件處理程式來修改按鈕的外觀和行為,以更好地滿足其程式的需求,然後做出明智的決策並計劃不同的內容。

步驟

安裝 Kivy:在開始設計應用程式之前,確保已在您的計算機上安裝 Kivy。您可以使用 pip 來安裝它。

pip install kivy

匯入所需的模組:將 Kivy 中的相關模組匯入您的 Python 指令碼。

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout

建立按鈕事件處理程式函式和 Kivy 應用類:建立一個將在按下按鈕時呼叫的方法,並定義一個從 App 派生的類。

class MyApp(App):
   def build(self):
      layout = BoxLayout(orientation='vertical')
      button = Button(text='Click Me!', on_press=self.on_button_press)
      layout.add_widget(button)
      return layout

   def on_button_press(self, instance):
      print("Button was pressed!")

執行 Kivy 應用

if __name__ == "__main__":
   MyApp().run()

執行指令碼

python your_script.py

使用 Kivy 設計應用程式

由於其直觀的語法,Python Kivy 使各種技能水平的開發人員都可以輕鬆建立動態的跨平臺應用程式。它透過多點觸控支援、豐富的視窗小部件庫和引人注目的動畫功能,在不同平臺上提供引人入勝的使用者體驗。因此,Kivy 已被廣泛用於建立各種服務於不同行業和領域的創新應用程式。

乒乓遊戲開發

經典街機遊戲“乒乓”是學習 Python Kivy 遊戲程式設計功能的一個很好的起點。藉助開源框架 Kivy,開發人員可以輕鬆建立跨平臺程式和遊戲,“乒乓”提供了一個絕佳的機會來探索其在建立互動式遊戲體驗方面的潛力。兩位玩家透過操控球拍來回擊球來爭奪分數,球速會越來越快。

步驟

  • 設定環境:安裝任何必要的庫,包括 Kivy。

  • 設計遊戲介面:建立一個 Kivy .kv 檔案來指定遊戲佈局,包括球拍、球和分數顯示。

  • 建立 Python 程式碼:在 Python 中實現遊戲邏輯,處理球拍移動、球碰撞和分數跟蹤。

  • 設定遊戲事件:使用 Kivy Clock 更新遊戲狀態並處理事件,例如球的移動和碰撞檢測。

  • 新增遊戲控制元件:實現觸控或鍵盤事件來控制球拍。

  • 測試和除錯:運行遊戲,測試其功能並進行必要的調整。

建立兩個檔案:一個名為 main.py 的 Python 檔案和一個名為 pong.kv 的 Kivy 檔案

示例

main.py 檔案

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import (
   NumericProperty, ReferenceListProperty, ObjectProperty
)
from kivy.vector import Vector
from kivy.clock import Clock


class PongPaddle(Widget):
   score = NumericProperty(0)

   def bounce_ball(self, ball):
      if self.collide_widget(ball):
         vx, vy = ball.velocity
         offset = (ball.center_y - self.center_y) / (self.height / 2)
         bounced = Vector(-1 * vx, vy)
         vel = bounced * 1.1
         ball.velocity = vel.x, vel.y + offset


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):
   ball = ObjectProperty(None)
   player1 = ObjectProperty(None)
   player2 = ObjectProperty(None)

   def serve_ball(self, vel=(4, 0)):
      self.ball.center = self.center
      self.ball.velocity = vel

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

      self.player1.bounce_ball(self.ball)
      self.player2.bounce_ball(self.ball)

      if (self.ball.y < self.y) or (self.ball.top > self.top):
         self.ball.velocity_y *= -1

      if self.ball.x < self.x:
         self.player2.score += 1
         self.serve_ball(vel=(4, 0))
      if self.ball.right > self.width:
         self.player1.score += 1
         self.serve_ball(vel=(-4, 0))

   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


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


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

pong.kv 檔案

#:kivy 1.0.9

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

<PongPaddle>:
   size: 25, 200
   canvas:
      Rectangle:
         pos: self.pos
         size: self.size

<PongGame>:
   ball: pong_ball
   player1: player_left
   player2: player_right
   
   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: str(root.player1.score)
      
   Label:
      font_size: 70  
      center_x: root.width * 3 / 4
      top: root.top - 50
      text: str(root.player2.score)
   
   PongBall:
      id: pong_ball
      center: self.parent.center
      
   PongPaddle:
      id: player_left
      x: root.x
      center_y: root.center_y
      
   PongPaddle:
      id: player_right
      x: root.width - self.width
      center_y: root.center_y

輸出

結論

在建立乒乓遊戲中,Python Kivy 作為開源框架的無縫實現就是一個有效性的例子。從頭開始建立遊戲的過程證明是一個寶貴的學習機會,使我們深入瞭解了使用者介面設計、Python 事件處理和基本遊戲開發原理。

更新於:2023年8月3日

643 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告