Kivy - Windows視窗



Window 類是 Kivy 框架的核心類之一。應用程式視窗的構建包括在一個特定的佈局中放置一個或多個元件。build() 方法通常返回單個根元件,它可能是多個其他元件的組合,以樹狀結構排列。或者,可以將元件樹的根直接新增到應用程式視窗。

Window 類定義在 "kivy.core.window" 模組中。它繼承自 WindowBase 類,WindowBase 類是任何視窗實現的抽象視窗元件。預設的應用程式視窗是在 App 物件啟動其事件迴圈時建立的。請注意,Kivy 每個應用程式只支援一個視窗。

許多 Window 屬性是從 Kivy 配置檔案(KIVY_HOME 目錄中的 "config.ini" 檔案)中讀取的。

元件的尺寸取決於預設視窗的大小。App 類的 build() 方法中的以下程式碼將元件樹放入應用程式視窗。請注意,build() 方法不返回根元件。而是將其新增到 Window 物件的 add_widget() 方法中。

box=BoxLayout(orientation='vertical')

l=Label(text='Window Properties', font_size=32)
box.add_widget(l)

b1=ToggleButton(text='Fullscreen')
b2=ToggleButton(text='Border')
b3=ToggleButton(text='Position')

bh=BoxLayout(orientation='horizontal', size_hint=(1, .2))
bh.add_widget(b1)
bh.add_widget(b2)
bh.add_widget(b3)

box.add_widget(bh)
Window.add_widget(box)

事件

Window 物件可以識別不同型別的事件:

  • 當分發新的 MotionEvent 時,會觸發 on_motion 事件。

  • Window 吸收觸控事件,例如 on_touch_down、on_touch_move、on_touch_up 等。

  • 當關閉 Window 時,會觸發 on_close 事件。

  • 當用戶想要透過按下標題欄上的關閉按鈕來結束事件迴圈時,會發生 on_request_close 事件。

  • 當游標進入視窗時,會觸發 on_cursor_enter 事件。

  • 類似地,當游標離開視窗時,會發生 on_cursor_leave 事件。

  • 當視窗分別最小化和最大化時,會觸發 on_minimize 和 on_maximize 事件。

  • 當視窗恢復時,會觸發 on_restore 事件。

與觸控事件類似,當按下或釋放按鍵時,on_key_down 和 on_key_up 事件分別發出按鍵、掃描碼、程式碼點、修飾符。

對於本章中的演示示例,讓我們將一些 Window 事件與回撥方法繫結。

Window.bind(on_request_close = self.on_close)
Window.bind(on_cursor_leave=self.on_leave)
Window.bind(on_cursor_enter=self.on_enter)

每當滑鼠指標離開視窗區域時,都會呼叫 on_leave() 方法。

def on_leave(self, *args):
   print ("leaving the window")

類似地,當滑鼠進入視窗區域時,會呼叫 on_enter 回撥。

def on_enter(self, *args):
   print ("Entering the window")

當用戶選擇關閉事件迴圈時,會引發 on_request_close 事件。如果使用者按下 X 按鈕,則以下回調會詢問使用者是否要退出。您還可以使彈出窗口出現。

def on_close(self, instance):
   resp=input("Do you want the window to close?")
   if resp=='y': Window.close()

屬性

應用程式視窗的外觀由 Window 類中定義的許多屬性決定。它們的預設值由 config.ini 檔案提供。但是,可以在應用程式程式碼中修改它們。一些 Window 屬性如下:

  • borderless - 設定為 True 時,此屬性將移除視窗邊框/裝飾。

  • children - 返回此視窗子元件的列表。

  • clearcolor - 用於清除視窗的顏色。clear() 方法使用此屬性及其顏色值。

from kivy.core.window import Window
Window.clearcolor = (1, 0, 0, 1)
Window.clear()
  • custom_titlebar - 設定為 True 時,允許使用者將元件設定為標題欄。

  • fullscreen - 此屬性設定視窗的全屏模式。可用選項:True、False、'auto' 和 'fake'。

  • left , top - 視窗的左和上位置。這是一個 SDL2 屬性,左上角為 [0, 0]。

  • size - 獲取/設定視窗的大小。

from kivy.core.window import Window
Window.size = (720,400)

您還可以透過修改配置值來設定大小:

from kivy.config import Config
Config.set('graphics', 'width', '720')
Config.set('graphics', 'height', '400')
Config.set('graphics', 'resizable', '1')

讓我們處理一些 Window 屬性。在這個程式的應用程式視窗上,我們有三個切換按鈕。我們將它們繫結到某些回撥。

b1.bind(on_press=self.pressed)
b2.bind(on_press=self.bordered)
b3.bind(on_press=self.positioned)

pressed() 方法在全屏和普通模式之間切換全屏狀態。

def pressed(self, instance):
   if instance.state=='down':
      Window.set_title("Kivy Full screen window")
      Window.maximize()
   elif instance.state=='normal':
      Window.set_title('Kivy Restored Window')
      Window.restore()

bordered() 方法在按下 b2 按鈕時使視窗無邊框,並在釋放時恢復為原始邊框視窗。

def bordered(self, instance):
   print (Window.top, Window.left)
   if instance.state=='down':
      Window.borderless=True
   elif instance.state=='normal':
      Window.borderless=False

positioned() 回撥將視窗移動到 (0,0) 位置,並在按下/釋放 b3 時返回其先前位置。

def positioned(self, instance):
   print (Window.top, Window.left)
   if instance.state=='down':
      self.x, self.y=Window.left, Window.top
      Window.left, Window.top=(0,0)
   elif instance.state=='normal':
      Window.left, Window.top=self.x,self.y

應用程式視窗最初顯示如下。生成事件(滑鼠離開、進入 on_request_close)並查看回調的執行情況。同樣檢查切換按鈕的動作。

Kivy Windows
廣告
© . All rights reserved.