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

How to ensure proper functionality when adding widgets to Kivy

我正在尝试创建一个 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

首页输出

第二页输出

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

方法 1 - 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))