Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在kivy中更新RecycleView中的数据?_Python_Kivy - Fatal编程技术网

Python 如何在kivy中更新RecycleView中的数据?

Python 如何在kivy中更新RecycleView中的数据?,python,kivy,Python,Kivy,我从kivy那里了解到,RecycleView可以在数据更改后通过调用refresh\u from\u data()手动更新数据。我还有几个问题 这是我的密码。我试图简化它,因为原来的一个相当长 在.py中 class FilterPage(Screen): def call_DB(self, price_min, price_max): 'codes and shits' 'Basically, I filter some result accordin

我从kivy那里了解到,RecycleView可以在数据更改后通过调用
refresh\u from\u data()
手动更新数据。我还有几个问题

这是我的密码。我试图简化它,因为原来的一个相当长

在.py中

class FilterPage(Screen):
    def call_DB(self, price_min, price_max):
        'codes and shits'
        'Basically, I filter some result according to users input'
        'and store it in a list called real_result'
        'I want to update content and length of real_result for RecycleView'

        self.app = App.get_running_app()
        self.rv = self.app.rv
        self.rv.refresh_from_data()

class RV(RecycleView):
    def __init__(self, **kwargs):
        super(RV, self).__init__(**kwargs)

        global real_result
        self.data = [{'text': str(x)} for x in range(len(real_result))]

kv = Builder.load_file("test.kv")
class MyApp(App):    
    rv = RV()
    def build(self):
        return kv

MyApp().run()
单位:千伏

<ProductButton>:
    on_release: print("success")
    canvas.before:
        Color:
            rgba: (0.4, 0.9, 0.1, 0.3)
        Rectangle:
            pos: self.pos
            size: self.size

<RV>:
    viewclass: 'ProductButton'    
    RecycleBoxLayout:
        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
        spacing: 10

<ProductPage>:
    canvas:
        Rectangle:
            source: "dot01.png"
            size: root.width, root.height
            pos: self.pos
    BoxLayout:
        orientation: "vertical"
        RV:
        Button:
            text: 'Previous screen'
            size_hint: None, None
            size: 150, 50
  • 我只想更新真实结果中的内容及其长度。可以通过从_data()调用刷新来完成吗?调用它时是否应该传递任何变量

  • 我想在self.data中包含一些信息。怎么做


  • 这个问题有点长,我删掉了很多代码。如果您需要更多详细信息,请在下面进行评论。非常感谢。

    要更改内容,只需更改包含的数据即可。不需要做任何额外的事情

    class RV(RecycleView):
        def __init__(self, **kwargs):
            super(RV, self).__init__(**kwargs)
    
            global real_result
            self.data = [{'text': str(x)} for x in range(len(real_result))]
    
        def alter_data(self):
            self.data = [{'text': str(x+x)} for x in range(len(real_result))] 
    
    然后调用alter_data

    在我的代码中,我使用:

    def refresh_data(self):
        self.data = []
        records_new = self.PW.dbcon.session.query ...
    
        for n_rows in records_new:
            r_tab_name = n_rows.tab_name
            d={'t_col1': r_tab_name.c1
                , 't_col2': r_tab_name.c2
                , 's_col3': r_tab_name.s3 if r_tab_name.s3 is not None else 0
                }
    
            self.data.append(d)
        self.data_for_thz=self.data
    
    千伏:

    :
    盒子布局:
    盒子布局:
    标签:
    按钮:
    按钮:
    ...
    :
    盒子布局:
    标签:
    ...
    回收审查:
    viewclass:'LocalRecyWidget'
    身份证:。。。。
    数据:root.data_表示_thz
    循环利用布局:
    ...
    
    要更改内容,只需更改包含的数据即可。不需要做任何额外的事情

    class RV(RecycleView):
        def __init__(self, **kwargs):
            super(RV, self).__init__(**kwargs)
    
            global real_result
            self.data = [{'text': str(x)} for x in range(len(real_result))]
    
        def alter_data(self):
            self.data = [{'text': str(x+x)} for x in range(len(real_result))] 
    
    然后调用alter_data

    在我的代码中,我使用:

    def refresh_data(self):
        self.data = []
        records_new = self.PW.dbcon.session.query ...
    
        for n_rows in records_new:
            r_tab_name = n_rows.tab_name
            d={'t_col1': r_tab_name.c1
                , 't_col2': r_tab_name.c2
                , 's_col3': r_tab_name.s3 if r_tab_name.s3 is not None else 0
                }
    
            self.data.append(d)
        self.data_for_thz=self.data
    
    千伏:

    :
    盒子布局:
    盒子布局:
    标签:
    按钮:
    按钮:
    ...
    :
    盒子布局:
    标签:
    ...
    回收审查:
    viewclass:'LocalRecyWidget'
    身份证:。。。。
    数据:root.data_表示_thz
    循环利用布局:
    ...
    
    我试图在self.rv.refresh\u from\u data()之后调用alter\u data(),但失败了。我在alter_data()中打印了real_结果的长度,它显示了正确的长度。但是RV什么也没显示。我是否在错误的位置调用了该函数?我猜在数据更改时会调用refresh_from_data()。因此,您必须在另一个调用中更改数据。您的意思是,也许我应该尝试在RecycleView中更新数据,以便执行类似于您的操作?当您更改数据时,视图会自动刷新,我想我尝试在self.rv.refresh\u from\u data()之后调用alter\u data(),但失败。我在alter_data()中打印了real_结果的长度,它显示了正确的长度。但是RV什么也没显示。我是否在错误的位置调用了该函数?我猜在数据更改时会调用refresh_from_data()。因此,您必须在另一个调用中更改数据。您的意思是,也许我应该尝试在RecycleView中更新数据,以便可以执行类似于您的操作?我认为,当您更改数据时,视图会自动刷新