Kivy 简明教程
Kivy - Popup
Kivy 中的 Popup 控件提供了一个对话框,该对话框出现在主父窗口上,通常是对按钮单击事件的响应。对于许多目的使用对话框,例如向用户显示某个消息,让用户输入一些内容,或让用户确认某项操作。
一般来说,任何 GUI 应用程序中的对话框有两种类型:模态和非模态。一个不允许用户在不与它交互的情况下与父窗口交互的对话框称为模态对话框。另一方面,如果用户可以在不与之交互的情况下关闭对话框,则它是非模态对话框。
在 Kivy 中,弹出对话框通常会覆盖整个父窗口。您可以根据需要配置它的大小。
Popup 类在“kivy.uix.popup”模块中定义。
from kivy.uix.popup import Popup
popup = Popup(**kwargs)
Popup 对象预先配置了一个布局,该布局包含标题和分隔栏。我们可以通过向其布局参数中添加其他小工具来自定义布局。
以下代码片段在父窗口上方生成一个简单的弹出窗口 -
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()
当带有“单击此处”标题的按钮被单击时,您将得到一个弹出对话框,如下所示 -
按弹出窗口上的确定按钮以将其关闭。
Popup 类定义了以下属性 -
-
content - 在标题正下方显示的弹出窗口的内容。content 是一个 ObjectProperty,默认为 None。
-
title - 表示弹出窗口标题的字符串。title 是一个 StringProperty,默认为“无标题”。
Popup 对象响应以下事件 -
-
on_open - 在打开 Popup 时触发。
-
on_dismiss - 在关闭 Popup 时触发。如果回调返回 True,则取消关闭。
Example
以下代码给出了 Kivy 中 Popup 对话框的一个很好的示例。首先,我们将一个标签和一个按钮添加到父窗口的垂直框布局中。按钮单击会弹出包含文本输入框的单列网格布局,要求用户输入姓名。在弹出窗口关闭后,该文本用于更改父窗口的标签。
这是 complete code −
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()