一按按钮如何在kv文件中写入弹出窗口

时间:2019-04-19 08:46:56

标签: python kivy

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.popup import Popup
from kivy.factory import Factory

class My3App(App):
    def build(self):
        return Hello()


class Hello(Widget):
    def btn(self):
        pass


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



kv File

<Hello>:
    Button:
        text : "button1"
        on_press : root.btn()

当我单击button1时如何创建弹出窗口?我想要一个包含许多按钮和标签的大弹出窗口。如何用kv语言编写弹出窗口?

预先感谢

2 个答案:

答案 0 :(得分:0)

问题1

当我单击button1时如何创建弹出窗口?

解决方案

在此解决方案中,它说明了dynamic class的用法,并且涉及到更改kv文件和Python脚本。

kv文件

  • 添加Kivy Factory的导入语句
  • 添加具有CustomPopup小部件继承的动态类Popup
  • 为button1添加on_release事件,该事件使用Kivy Factory注册和实例化动态类CustomPopup。使用弹出窗口的open()方法显示弹出窗口。
片段-KV
#:import Factory kivy.factory.Factory
...
<CustomPopup@Popup>:
...
<Hello>:
    Button:
        text : "button1"
        on_release: Factory.CustomPopup().open()

Py文件

  • btn()删除class Hello()方法
  • pass添加到class Hello()
片段-Py
class Hello(Widget):
    pass

问题2

如何用kv语言编写弹出窗口?

解决方案

有两种方法可以实现具有Popup继承的类。

方法1-使用Dynamic Class

在此方法中,仅涉及对kv文件的更改。我们添加了动态类规则。

片段-KV
#:import Factory kivy.factory.Factory

<CustomPopup@Popup>:
    title: 'Test popup'
    size_hint: (None, None)
    size: (400, 400)
    Label:
        text: 'Hello world'

<Hello>:
    Button:
        text : "button1"
        on_release: Factory.CustomPopup().open()

方法2-使用普通类

在此方法中,它涉及对kv文件和Python脚本的更改。我们在kv文件中添加了一个类规则,并在Python脚本中实现了一个类。

片段-KV
<CustomPopup>:
    title: 'Test popup'
    size_hint: (None, None)
    size: (400, 400)
    Label:
        text: 'Hello world'

<Hello>:
    Button:
        text : "button1"
        on_press: root.btn()
片段-Py
from kivy.uix.popup import Popup
...
class CustomPopup(Popup):
    pass


class Hello(Widget):
    def btn(self):
        popup = CustomPopup()
        popup.open()

问题3

我想要一个包含许多按钮和标签的大弹出窗口。

解决方案

在此解决方案中,我们将使用dynamic class,并将按钮和标签添加到kv文件中。创建弹出窗口时,必须至少设置Popup.titlePopup.contentPopup.content可以是任何小部件,例如ScreenLayoutsBoxLayoutGridLayout等),LabelButton等。BoxLayout或{ {3}},您可以添加GridLayoutLabel

摘要-kv

#:import Factory kivy.factory.Factory

<CustomPopup@Popup>:
    title: 'My Custom Kivy Popup'
    auto_dismiss: False

    BoxLayout:
        orientation: 'vertical'
        BoxLayout:
            size_hint: 1, 0.9
            Label:
                text: 'Hello'
            Label:
                text: 'Kivy'
        BoxLayout:
            orientation: 'vertical'
            Label:
                text: 'Linux'
            Label:
                text: 'Python'

        GridLayout:
            rows: 1
            row_force_default: True
            row_default_height: '46dp'
            col_force_default: True
            col_default_width: '200dp'
            Button:
                text: 'Close this popup'
                on_release: root.dismiss()
            Button:
                text: 'Cancel'
                on_release: root.dismiss()

<Hello>:
    Button:
        text : "button1"
        on_release: Factory.CustomPopup().open()

答案 1 :(得分:-1)

您应该查看本教程:https://kivy.org/doc/stable/api-kivy.uix.popup.html

MyPopup = Popup(title='Test popup', content=Label(text='Hello world'),
          auto_dismiss=False
Button:
    text: 'Open popup'
    on_release: Factory.MyPopup().open()