【问题标题】:Kivy doubled RecycleViewKivy 将 RecycleView 翻倍
【发布时间】:2019-04-05 04:19:17
【问题描述】:

有人知道是什么原因造成的吗?我的 Kivy RecycleView 在可编辑的后面有一个奇怪的静态版本 - 它不能以任何方式选择或更改。这让我觉得我可能有所有 Kivy 小部件的重复版本?我不愿意粘贴我的所有代码,因为它可以访问一个 api,并且在应用程序本身中有凭据信息以及大量个人信息。

双循环视图


class SelectableRecycleBoxLayout(FocusBehavior, LayoutSelectionBehavior,
                                 RecycleBoxLayout):
    ''' Adds selection and focus behaviour to the view. '''


class SelectableLabel(RecycleDataViewBehavior, Label):
    ''' Add selection support to the Label '''
    index = None
    selected = BooleanProperty(False)
    selectable = BooleanProperty(True)

    def refresh_view_attrs(self, rv, index, data):
        ''' Catch and handle the view changes '''
        self.index = index
        return super(SelectableLabel, self).refresh_view_attrs(
            rv, index, data)

    def on_touch_down(self, touch):
        ''' Add selection on touch down '''
        if super(SelectableLabel, self).on_touch_down(touch):
            return True
        if self.collide_point(*touch.pos) and self.selectable:
            return self.parent.select_with_touch(self.index, touch)

    def apply_selection(self, rv, index, is_selected):
        ''' Respond to the selection of items in the view. '''
        self.selected = is_selected
        if is_selected:
            print("selection changed to {0}".format(rv.data[index]))
        else:
            print("selection removed for {0}".format(rv.data[index]))



class RV(RecycleView):

    def __init__(self, **kwargs):
        super(RV, self).__init__(**kwargs)
        self.data = [{'text': str(x)} for x in range(10)]

class GuiApp(App):
    theme_cls = ThemeManager()
    theme_cls.theme_style = 'Dark'
    previous_date = ''
    previous_date2 = ''
    StartDate = ObjectProperty("Start Date")
    EndDate = ObjectProperty("End Date")



    def build(self):
        self.pickers = Factory.AnotherScreen()
        presentation = Builder.load_file("gui.kv")
        return presentation


这是我的 Kivy:


            RV:
                id: rv
                viewclass: 'SelectableLabel'
                SelectableRecycleBoxLayout:
                    default_size: None, dp(56)
                    default_size_hint: 1, None
                    size_hint_y: None
                    height: self.minimum_height
                    orientation: 'vertical'
                    multiselect: True
                    touch_multiselect: True


<SelectableLabel>:
    # Draw a background to indicate selection
    canvas.before:
        Color:
            rgba: (.4, 0.4, .4, .3) if self.selected else (.2, .2, .2, 1)
        Rectangle:
            pos: self.pos
            size: self.size

我希望这是足够的信息,至少可以让我知道在哪里查看。我也在努力更新 RecycleView 中的数据,但这可能是因为这个问题?我可能有两个不同的小部件实例正在运行,但我不确定这怎么可能..

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    根本原因 - 看到双打

    双重是由于按文件名约定加载 kv 文件并使用Builder

    例如:使用Builder.load_file('gui.kv'),你的kv文件名为gui.kv

    片段

    class GuiApp(App):
        ...
    
        def build(self):
            self.pickers = Factory.AnotherScreen()
            presentation = Builder.load_file("gui.kv")
            return presentation
    

    解决方案

    这个问题有两种解决方案。

    方法一

    将 App 类从 GuiApp() 重命名为 TestApp()

    方法二

    只要有根规则,就不需要在 App 类中返回任何内容,例如BoxLayout: 在 kv 文件中。

    删除以下内容:

    • presentation = Builder.load_file("gui.kv")
    • return presentation

    参考文献

    Kv language » How to load KV

    有两种方法可以将 Kv 代码加载到您的应用程序中:

    按名称约定:

    Kivy 会在其中查找与您的 App 类同名的 Kv 文件 小写,如果以“App”结尾,则减去“App”,例如:

    MyApp -> my.kv
    

    如果这个文件定义了一个 Root Widget,它将被附加到应用程序的 root 属性并用作应用程序小部件树的基础。

    按生成器约定:

    您可以告诉 Kivy 直接加载字符串或文件。如果这个字符串 或者文件定义了一个根小部件,它将由方法返回:

    Builder.load_file('path/to/file.kv')
    

    或:

    Builder.load_string(kv_string)
    

    示例

    main.py

    ​​>
    from kivy.app import App
    
    
    class GuiApp(App):
    
        def build(self):
            self.pickers = None
    
    
    if __name__ == "__main__":
        GuiApp().run()
    

    gui.kv

    #:kivy 1.11.0
    
    Button:
        text: 'Hello Kivy'
        font_size: 50
    

    输出

    【讨论】:

    • 我认为为了让 kv 文件无需使用 Builder 自动打开,它必须与您的主 py 文件同名或其他名称?我的 py 文件名为“HarvestIntel.py”,我的 kv 文件名为“gui.kv”。那么你是说我可以在我的构建方法中删除 Builder 行吗?然后我会返回什么来加载 kivy 文件?感谢您的帮助!
    • 由于您的 App 类是 GuiApp,Kivy 会查找与您的 App 类同名的小写 Kv 文件,减去“App”即gui.kv。没错,可以去掉presentation = Builder.load_file('gui.kv')
    • 我已经用解决方案和对 Kivy 文档的参考更新了帖子。请记住接受和/或投票给答案。谢谢。
    • 非常感谢您提供的完美帮助!使用我的单独 RV(RecycleView) 类对我的代码进行布局,我应该将代码放在哪里来更新数据?就像我想要一个数据来完全更新一切。我把它放在我的房车课上吗?因为每次我调用该类时,我的 init 都会运行并清除数据?那有意义吗?我也不知道如何在按下按钮时从 kivy 调用它?
    • Kivy处理kv文件时,类RV被kv语言实例化,RV:。在 Python 脚本中,通过其 id 引用/调用实例化类 RV,即 rv,如 kv 文件中所声明的,例如self.root.ids.rv.attribute-nameself.root.ids.rv.method-name。您可能想使用 RecycleView 查看另一篇帖子,How to add vertical scroll to RecycleView
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多