向 Kivy 添加小部件时如何确保功能正常

Posted

技术标签:

【中文标题】向 Kivy 添加小部件时如何确保功能正常【英文标题】:How to ensure proper functionality when adding widgets to Kivy 【发布时间】:2019-11-27 20:18:44 【问题描述】:

我正在尝试创建一个 Kivy/Python 应用程序,它让用户在一个屏幕上按下一个按钮,然后将几个小部件添加到下一个屏幕。但是,当我运行脚本时,按钮出现并且可以在第一页上单击,而小部件在第二页上可见,但无法与之交互。

这是我的代码示例,感谢任何帮助:

py:

import kivy
kivy.require('1.11.1')

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ListProperty, StringProperty, ObjectProperty
from kivy.core.window import Window
from kivy.uix.label import Label
from kivy.uix.scrollview import ScrollView
from kivy.uix.button import Button
from kivy.uix.spinner import Spinner

sm = None

class RcGUITestApp(App):
    def build(self):
        global sm
        Window.clearcolor = (0, 0, 0.35, 1)
        sm = ScreenManager()
        sm.add_widget(NewJobPage(name="new_job_page"))
        sm.add_widget(IPMConfirmPage(name = "ipm_confirm_page"))
        return sm

class NewJobPage(Screen):
    def retrieve(self):
        global rc
        global sm
        sm.get_screen("ipm_confirm_page").displayIPM()

class IPMConfirmPage(Screen):
    grid = ObjectProperty(None)

    def displayIPM(self):
        for ipm in range(50):
            self.grid.add_widget(Label(text="A"))
            self.grid.add_widget(Spinner(text="B"))
            self.grid.add_widget(Spinner(text="C"))

def main():
    rc_gui = RcGUITestApp()
    rc_gui.run()

if __name__ == "__main__":
        main()

kv:

<NewJobPage>:
        BoxLayout:
                orientation: "horizontal"
                size_hint: (1, .35)

                Button:
                        text: "RETRIEVE"
                        pos_hint: "center_x": .5, "center_y": .5
                        size_hint: (.33, .33)
                        color: (1,1,1,1)
                        on_press:
                                root.retrieve()
                                root.manager.transition.direction = "left"
                                root.manager.transition.duration = .8
                                root.manager.current = "ipm_confirm_page"

<IPMConfirmPage>:
        grid: Grid
        GridLayout:
                cols: 1
                size_hint_x: 1
                padding: 10
                spacing: 10

                BoxLayout:
                        size_hint: (1, 0.1)

                        Label:
                                text: "IPM"
                        Label:
                                text: "CD#"
                        Label:
                                text: "CONDUCTOR"

                ScrollView:

                        GridLayout:
                                id: Grid
                                cols: 3
                                height: self.minimum_height
                                size_hint: 1, None
                                spacing: 50
                                padding: 30

首页输出

第二页输出

【问题讨论】:

【参考方案1】:

您需要提供添加到grid 的每个小部件的height。该问题有两种解决方案。

方法一——kv文件

此方法只涉及通过添加row_force_default: Truerow_default_height: 40 来更改kv 文件。

片段 - kv 文件

    ScrollView:

        GridLayout:
            row_force_default: True
            row_default_height: 40
            ...

方法二——py文件

此方法仅涉及通过添加size_hint_y=Noneheight=40 来更改py 文件。

片段

def displayIPM(self):
    for ipm in range(50):
        self.grid.add_widget(Label(text="A", size_hint_y=None, height=40))
        self.grid.add_widget(Spinner(text="B", size_hint_y=None, height=40))
        self.grid.add_widget(Spinner(text="C", size_hint_y=None, height=40))

【讨论】:

以上是关于向 Kivy 添加小部件时如何确保功能正常的主要内容,如果未能解决你的问题,请参考以下文章

Kivy 中的中心小部件

Kivy 小部件行为异常

如果未动态添加,如何正确删除Kivy中的小部件

Kivy 在布局末尾添加小部件

如何清除 kivy 中的小部件?

如何在 kivy python 中的标签、文本输入和其他小部件中添加标题