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

Posted

技术标签:

【中文标题】Kivy:弹出窗口只能有一个小部件作为内容(当我导入两个不同的弹出模块时)【英文标题】:Kivy: Popup can have only one widget as content (When I import two different popup modules) 【发布时间】:2020-12-26 19:37:47 【问题描述】:

我正在使用 kivy 设计一个应用程序,我需要两个不同的弹出窗口小部件。我使用“kv”语言设计了它们。当我在我的项目文件中导入这些弹出模块时,它会抛出:

'弹出窗口只能有一个小部件作为内容'

这是我的项目文件。

import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from myPopups.Popup1 import Popup1Window
from myPopups.Popup2  import Popup2Window

Builder.load_file('project.kv')
class ProjectWindow(BoxLayout):
    
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.mypopup1 = Popup1Window()
        self.mypopup2 = Popup2Window()

Popup1.kv 文件

<Popup>:
    size_hint: 0.4,0.5
    auto_dismiss:True
    title: 'Popup 1'
    id:mypopup1
    orientation: "vertical"
    BoxLayout:
        id: header1
        orientation:'vertical'
        size_hint_y:1
        size_hint_x:1
        padding:3
        canvas.before:
            Color:
                rgba:(.06,.35,.45,1)
        BoxLayout:
            id:text_box1
            size_hint_y:None
            size_hint_x:1
            height:60
            TextInput:
                id:txt_qty1
                text:''
                multiline:False
                halign: 'center'
                valign: 'middle'
                font_size:30

        GridLayout:
            id:popup_numpad1
            size_hint_y:None
            size_hint_x:1
            # spacing:'3'
            height:230
            rows:4
            cols:3
            spacing:4

            Button:
                text: 'Popup 1 Button'
                bold:True
                font_size:17
                background_normal:''
                background_color:(.06,.45,.45,1)

Popup1.py 文件

import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.popup import Popup
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button


Builder.load_file('myPopus/popup1.kv')
class Popup1Window(Popup):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        print("This is Popup 1")

同理,Popup2.kv 文件

<Popup>:
    size_hint: 0.4,0.5
    auto_dismiss:True
    title: 'Popup 2'
    id:mypopup2
    orientation: "vertical"
    BoxLayout:
        id: header2
        orientation:'vertical'
        size_hint_y:1
        size_hint_x:1
        padding:3
        canvas.before:
            Color:
                rgba:(.06,.35,.45,1)
        BoxLayout:
            id:text_box2
            size_hint_y:None
            size_hint_x:1
            height:60
            TextInput:
                id:txt_qty2
                text:''
                multiline:False
                halign: 'center'
                valign: 'middle'
                font_size:30

        GridLayout:
            id:popup_numpad2
            size_hint_y:None
            size_hint_x:1
            # spacing:'3'
            height:230
            rows:4
            cols:3
            spacing:4

            Button:
                text: 'Popup 2 Button'
                bold:True
                font_size:17
                background_normal:''
                background_color:(.06,.45,.45,1)

Popup2.py 文件

import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.popup import Popup
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button


Builder.load_file('myPopus/popup2.kv')
class Popup2Window(Popup):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        print("This is Popup 2")

请在这方面帮助我。谢谢。

【问题讨论】:

【参考方案1】:

您的每个kv 文件都包含&lt;Popup&gt; 的规则。加载第二个 kv 文件时,会将第二个 &lt;Popup&gt; 规则的内容添加到第一个规则中,从而生成 &lt;Popup&gt; 的最终规则,该规则具有 Popup 的两个子项。当您为类加载规则时(如&lt;Popup&gt;),它适用于加载kv 后在App 中创建的所有Popup 实例。通常,如果您希望将不同的规则应用于Popup 的不同实例,您将使用Popup 的子类(就像您一样),并为每个子类加载不同的规则。

您可能希望将Popup1.kv 中的规则更改为&lt;Popup1Window&gt;,同样,将Popup2.kv 中的规则更改为&lt;Popup2Window&gt;

【讨论】:

以上是关于Kivy:弹出窗口只能有一个小部件作为内容(当我导入两个不同的弹出模块时)的主要内容,如果未能解决你的问题,请参考以下文章

kivy - 绑定弹出窗口关闭以从另一个小部件实例中运行

如何在 Kivy 中设置小部件/布局的最小允许宽度/高度?

在 Kivy 中,如何使用另一个类的关闭按钮关闭弹出窗口?

Kivy - 检查当前是不是显示弹出窗口(因为 Kivy 弹出窗口不是真正的模态(后退按钮/键盘))

Kivy 更改标签小部件来自另一个类的文本

kivy 应用程序中的一个简单网页作为小部件