Kivy - 彈出視窗



Kivy 中的 Popup 控制元件會顯示一個對話方塊,該對話方塊覆蓋主父視窗,通常是響應按鈕點選事件而出現的。對話方塊用於多種目的,例如向用戶顯示特定訊息、讓使用者輸入某些內容或詢問使用者是否確認特定操作。

一般來說,任何 GUI 應用程式中的對話方塊都分為兩種型別:模態和非模態。不允許使用者在不與之互動的情況下與父視窗互動的對話方塊稱為模態對話方塊。另一方面,如果使用者可以在不與之互動的情況下關閉對話方塊,則它是非模態對話方塊。

在 Kivy 中,彈出對話方塊預設覆蓋整個父視窗。您可以根據需要配置其大小。

Popup 類在 "kivy.uix.popup" 模組中定義。

from kivy.uix.popup import Popup
popup = Popup(**kwargs)

Popup 物件預先配置了一個包含標題和分隔線的佈局。我們可以透過向其 layout 引數新增其他控制元件來自定義佈局。

以下程式碼片段在父視窗上生成一個簡單的彈出視窗:

from kivy.uix.popup import Popup
popup = Popup(title='Popup Demo',
   content=Label(text='This is a Popup'),
   size_hint=(None, None), size=(400, 400))

您需要呼叫 Popup 物件的 open() 方法來顯示它。

popup.open()

顯示彈出視窗後,任何點選其外部的操作都會將其關閉。要防止彈出視窗自動關閉,請將 auto_dismiss 屬性設定為 False。您需要顯式呼叫 popup.dismiss() 方法。通常,這是透過將其繫結到按鈕的 on_press 事件來完成的。

class popdemo(App):
   def build(self):
      btn = Button(text="Click here")
      btn.bind(on_press=self.onButtonPress)
      return btn
   
   def onButtonPress(self, button):
      layout = GridLayout(cols=1)
      lbl = Label(text='Hello world')
      closeButton = Button(text="OK")
      layout.add_widget(lbl)
      layout.add_widget(closeButton)
      popup = Popup(
         title='Popup Demo', content=layout,
         auto_dismiss=False, size_hint=(None, None),
         size=(400, 400)
      )
      popup.open()
      closeButton.bind(on_press=self.on_close)
   
   def on_close(self, event):
      self.popup.dismiss()

當單擊標題為“單擊此處”的按鈕時,您將看到如下所示的彈出對話方塊:

Kivy Popup

按彈出視窗上的“確定”按鈕將其關閉。

Popup 類定義了以下屬性:

  • content − 彈出視窗的內容,顯示在標題下方。content 是一個 ObjectProperty,預設為 None。

  • title − 表示彈出視窗標題的字串。title 是一個 StringProperty,預設為 'No title'。

Popup 物件響應以下事件:

  • on_open − 彈出視窗開啟時觸發。

  • on_dismiss − 彈出視窗關閉時觸發。如果回撥函式返回 True,則取消關閉操作。

示例

以下程式碼給出了 Kivy 中 Popup 對話方塊的一個很好的例子。首先,我們在父視窗的垂直箱式佈局中添加了一個標籤和一個按鈕。按鈕點選會彈出一個單列網格佈局,其中包含一個文字輸入框,提示使用者輸入姓名。當彈出視窗關閉時,該文字用於更改父視窗的標籤。

以下是完整程式碼

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.gridlayout import GridLayout
from kivy.uix.popup import Popup
from kivy.core.window import Window

Window.size = (720, 400)

class PopupExample(App):
   def build(self):
      self.layout = GridLayout(cols=1, padding=10)
      
      self.l1 = Label(
         text='enter your name', font_size=32,
         color=[.8, .6, .4, 1]
      )
      self.layout.add_widget(self.l1)
      
      self.button = Button(text="Click Here")
      self.layout.add_widget(self.button)
      self.button.bind(on_press=self.onButtonPress)
      return self.layout
   
   def onButtonPress(self, button):
      layout = GridLayout(cols=1, padding=10)
      
      popupLabel = Label(text="Enter name")
      self.t1 = TextInput()
      closeButton = Button(text="OK")
      
      layout.add_widget(popupLabel)
      layout.add_widget(self.t1)
      layout.add_widget(closeButton)
      
      self.popup = Popup(
         title='Hello', content=layout,
         auto_dismiss=False, size_hint=(None, None),
         size=(200, 200)
      )
      self.popup.open()
      closeButton.bind(on_press=self.on_close)
   
   def on_close(self, event):
      self.l1.text = 'Thanks ' + self.t1.text
      self.popup.dismiss()
PopupExample().run()

輸出

應用程式視窗如下所示:

Kivy Popup Dialog
廣告

© . All rights reserved.