多个 kivy 弹出应用程序

Posted

技术标签:

【中文标题】多个 kivy 弹出应用程序【英文标题】:Multiple kivy popup applications 【发布时间】:2020-01-21 16:29:10 【问题描述】:

我正在尝试构建一个 python-kivy 应用程序,该应用程序可以创建弹出窗口并根据用户的输入返回结果。 Kivy 应用程序应该一直运行,直到弹出窗口消失。我可以创建第一个应用程序并正确获取弹出结果,但在尝试创建第二个应用程序后出现错误。我不能在 Kivy 中创建多个(非同时)应用程序吗?

from kivy.app import App
from kivy.uix.popup import Popup
from kivy.uix.floatlayout import FloatLayout
from kivy.core.window import Window
from kivy.lang.builder import Builder

Builder.load_string("""
<PopupYesNo>:
    Label:
        id: label
        text: "Hello"
        pos_hint: 'center_x':0.5, 'center_y':0.65

    Button:
        text: "Yes"
        size_hint: 0.3, 0.2
        pos_hint: 'center_x':0.25, 'top':0.25
        on_release: root.dismiss('Yes')

    Button:
        text: "No"
        size_hint: 0.3, 0.2
        pos_hint: 'center_x':0.75, 'top':0.25
        on_release: root.dismiss('No')
""")


class MyPopupApp(App):

    def __init__(self, popup_text):
        super(MyPopupApp, self).__init__()
        self.popup_text = popup_text
        self.result = ''

    def build(self):
        Window.size = 300, 200
        Window.borderless = True

        self.title = "Input"

        popup = PopupYesNo()
        popup.set_text(self.popup_text)
        popup = Popup(title='Input', size=(300, 200), size_hint=(None, None), content=popup)
        return popup

class PopupYesNo(FloatLayout):

    def set_text(self, text):
        self.ids['label'].text = text

    def dismiss(self, value):
        app = App.get_running_app()
        app.result = value
        app.stop()


if __name__ == '__main__':

    app = MyPopupApp("Are you reading this?")
    app.run()
    print('First popup result: '+ app.result)
    app = MyPopupApp("Choose yes or no")
    app.run()
    print('First popup result: '+ app.result)

我得到的错误::(

   File "C:\Python27\lib\site-packages\kivy\app.py", line 855, in run
     runTouchApp()
   File "C:\Python27\lib\site-packages\kivy\base.py", line 506, in runTouchApp
     stopTouchApp()
   File "C:\Python27\lib\site-packages\kivy\base.py", line 521, in stopTouchApp
     EventLoop.close()
   File "C:\Python27\lib\site-packages\kivy\base.py", line 172, in close
     self.stop()
   File "C:\Python27\lib\site-packages\kivy\base.py", line 184, in stop
     provider.stop()
   File "C:\Python27\lib\site-packages\kivy\input\providers\wm_pen.py", line 111, in stop
     SetWindowLong_WndProc_wrapper(self.hwnd, self.old_windProc)
   File "C:\Python27\lib\site-packages\kivy\input\providers\wm_common.py", line 122, in _closure
     oldAddr = func(hWnd, GWL_WNDPROC, cast(wndProc, c_void_p).value)
 ctypes.ArgumentError: argument 3: <type 'exceptions.TypeError'>: wrong type

【问题讨论】:

您通常只使用一个继承自 App 类的类。您想要只出现在应用程序内部的弹出窗口,还是想要打开多个可以单独关闭的屏幕?首先,您应该使用ModalView 类:kivy.org/doc/stable/api-kivy.uix.modalview.html 【参考方案1】:

如前所述,您通常只使用一个连续运行的“应用”类。 例如:

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

要创建一个弹出窗口,我建议您使用一个由函数调用的类。

    创建你的类

    类 P(FloatLayout): 通过

或者在你的例子中,现有的类应该已经很好了:

class PopupYesNo(FloatLayout):

def set_text(self, text):
    self.ids['label'].text = text

def dismiss(self, value):
    app = App.get_running_app()
    app.result = value
    app.stop()

    创建一个函数来调用该类(我不知道为什么它不显示,但这也是代码)

    def show_popup(): 显示 = P()

    popupWindow = Popup(title="弹出窗口", content=show, size_hint=(None,None), size=(400,400)) popupWindow.open()

或者在你的情况下改变行

show = P()

show = PopupYesNo()

这应该可以工作,因为您已经导入了 Popup。

现在您应该可以在您想要的位置调用弹出窗口

if thingshappen:
    show_popup()

我希望这会有所帮助,如果适合,请随时要求我将我的答案更详细 你的问题。

【讨论】:

以上是关于多个 kivy 弹出应用程序的主要内容,如果未能解决你的问题,请参考以下文章

python中的Kivy弹出窗口,按钮上有多个on_release操作

Kivy:弹出窗口不显示

Kivy:弹出窗口只能有一个小部件作为内容(当我导入两个不同的弹出模块时)

同时运行多个相互通信的 Kivy 应用程序

Kivy Popup 无法访问 root 方法

如何在kivy中引用另一个类方法