<tfoot id='0y9Zs'></tfoot>
    1. <legend id='0y9Zs'><style id='0y9Zs'><dir id='0y9Zs'><q id='0y9Zs'></q></dir></style></legend>

      • <bdo id='0y9Zs'></bdo><ul id='0y9Zs'></ul>

        <small id='0y9Zs'></small><noframes id='0y9Zs'>

        <i id='0y9Zs'><tr id='0y9Zs'><dt id='0y9Zs'><q id='0y9Zs'><span id='0y9Zs'><b id='0y9Zs'><form id='0y9Zs'><ins id='0y9Zs'></ins><ul id='0y9Zs'></ul><sub id='0y9Zs'></sub></form><legend id='0y9Zs'></legend><bdo id='0y9Zs'><pre id='0y9Zs'><center id='0y9Zs'></center></pre></bdo></b><th id='0y9Zs'></th></span></q></dt></tr></i><div id='0y9Zs'><tfoot id='0y9Zs'></tfoot><dl id='0y9Zs'><fieldset id='0y9Zs'></fieldset></dl></div>

        每次数据更改时如何刷新kivy RecycleView?

        时间:2023-06-07

          <small id='QSwcF'></small><noframes id='QSwcF'>

              <tbody id='QSwcF'></tbody>
            <tfoot id='QSwcF'></tfoot>

              <bdo id='QSwcF'></bdo><ul id='QSwcF'></ul>
              <i id='QSwcF'><tr id='QSwcF'><dt id='QSwcF'><q id='QSwcF'><span id='QSwcF'><b id='QSwcF'><form id='QSwcF'><ins id='QSwcF'></ins><ul id='QSwcF'></ul><sub id='QSwcF'></sub></form><legend id='QSwcF'></legend><bdo id='QSwcF'><pre id='QSwcF'><center id='QSwcF'></center></pre></bdo></b><th id='QSwcF'></th></span></q></dt></tr></i><div id='QSwcF'><tfoot id='QSwcF'></tfoot><dl id='QSwcF'><fieldset id='QSwcF'></fieldset></dl></div>

                  <legend id='QSwcF'><style id='QSwcF'><dir id='QSwcF'><q id='QSwcF'></q></dir></style></legend>
                  本文介绍了每次数据更改时如何刷新kivy RecycleView?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我正在尝试创建一个简单的考勤应用程序.

                  I am trying to create a simple attendance app.

                  当程序启动时,所有标签都在取消选择列表中

                  When program is launched all labels are in deselected list

                  Expected behavior: when any label is selected data moves to the selected list and now selected labels are in the end of the joined list.然后 RecycleView 刷新以显示此更改.

                  Expected behavior: when any label is selected data moves to the selected list and now selected labels are in the end of the joined list. Then RecycleView refreshes to display this change.

                  所以我设法让数据从一个列表移动到另一个列表,但我无法让 RecycleView 刷新

                  So I managed to make the data to move from one list to another, but I can't make RecycleView to refresh

                  我尝试使用 id 但失败了

                  I tried using ids but failed

                  我希望有人可以帮助我.我认为这对于知识渊博的人来说是一个常规问题,但对于像我这样的菜鸟来说却不是.

                  I hope someone can help me. I think this is a routine problem for people who are knowledgeable, but for noobs like me it is not.

                  我是第一次在这个网站上提问,所以提前抱歉

                  I am asking question on this site for the first time so sorry in advance

                  代码如下:

                  from kivy.app import App
                  from kivy.lang import Builder
                  from kivy.uix.boxlayout import BoxLayout
                  from kivy.uix.textinput import TextInput
                  from kivy.uix.button import Button
                  from kivy.uix.recycleview import RecycleView
                  from kivy.uix.recycleview.views import RecycleDataViewBehavior
                  from kivy.uix.label import Label
                  from kivy.properties import BooleanProperty
                  from kivy.properties import ListProperty
                  from kivy.uix.recycleboxlayout import RecycleBoxLayout
                  from kivy.uix.behaviors import FocusBehavior
                  from kivy.uix.recycleview.layout import LayoutSelectionBehavior
                  from datetime import datetime
                  import kivy
                  from kivy.config import Config
                  Config.set('graphics', 'width', '300')
                  Config.set('graphics', 'height', '500')
                  
                  importedlist = ['Novella Varela', 'Caroll Faircloth', 'Douglas Schissler',
                                  'Rolande Hassell', 'Hayley Rivero', 'Niesha Dungy', 'Winfred Dejonge', 'Venetta Milum']
                  deselected_list = importedlist[:]
                  selected_list = []
                  
                  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.
                          and add/remove items from lists
                          '''
                          self.selected = is_selected
                          if self.selected and self.text in deselected_list:
                              selected_list.append(self.text)
                              deselected_list.remove(self.text)
                              print(selected_list)
                          elif not self.selected and self.text in selected_list:
                              deselected_list.append(self.text)
                              selected_list.remove(self.text)
                              print(deselected_list)
                  
                  class RV(RecycleView):
                      # this needs to be updated every time any label is selected or deselected
                      def __init__(self, **kwargs):
                          super(RV, self).__init__(**kwargs)
                          self.data = ([{'text': str(row)} for row in sorted(deselected_list)]
                                       + [{'text': str(row)} for row in sorted(selected_list)])
                  
                  class Screen(BoxLayout):
                      now = datetime.now()
                  
                      def nowdate(self):
                          return self.now.strftime('%d')
                  
                      def nowmonth(self):
                          return self.now.strftime('%m')
                  
                      def nowyear(self):
                          return self.now.strftime('%y')
                  
                      def nowhour(self):
                          return self.now.strftime('%H')
                  
                      def nowminute(self):
                          return self.now.strftime('%M')
                  
                  Builder.load_string('''
                  #:import datetime datetime
                  
                  <Screen>:
                      orientation: 'vertical'
                      BoxLayout:
                          size_hint_y: None
                          height: 30
                          TextInput:
                              id: date
                              text: root.nowdate()
                          TextInput:
                              id: date
                              text: root.nowmonth()
                          TextInput:
                              id: date
                              text: root.nowyear()
                          TextInput:
                              id: date
                              text: root.nowhour()
                          TextInput:
                              id: date
                              text: root.nowminute()
                          Button:
                      RV:
                          viewclass: 'SelectableLabel'
                          SelectableRecycleBoxLayout:
                              default_size: None, dp(45)
                              default_size_hint: 1, None
                              size_hint_y: None
                              height: self.minimum_height
                              orientation: 'vertical'
                              multiselect: True
                              touch_multiselect: True
                      Button:
                          size_hint_y: None
                          height: 30
                  
                  <SelectableLabel>:
                      # Draw a background to indicate selection
                      canvas.before:
                          Color:
                              rgba: (.0, 0.9, .1, .3) if self.selected else (0, 0, 0, 1)
                          Rectangle:
                              pos: self.pos
                              size: self.size
                  
                  ''')
                  
                  class TestApp(App):
                      def build(self):
                          return Screen()
                  
                  if __name__ == '__main__':
                      TestApp().run()
                  

                  推荐答案

                  好吧,实际上我确实绊倒了几次试图解决这个问题,但我想我明白了.我所做的是创建两个回收视图和一个可以访问 ButtonBehaviors 的 CustomLabel,这样您就可以使用 'on_press' 而不是 'on_touch_down' (通过整个树而不是与元素交互).

                  Alright, so I did actually stumble a few times trying to sort this out but I think I've got it. What I did was create two recycle views and a CustomLabel that has access to ButtonBehaviors so you can use 'on_press' instead of 'on_touch_down' (which propagates through the entire tree rather than the interacted with element).

                  示例视频

                  py文件:

                  from kivy.app import App
                  from kivy.uix.recycleview import RecycleView
                  from kivy.uix.label import Label
                  from kivy.uix.behaviors import ButtonBehavior
                  from kivy.uix.floatlayout import FloatLayout
                  
                  # Create a Custom ButtonLabel that can use on_press
                  class ButtonLabel(ButtonBehavior, Label):
                  
                      # App.get_running_app() lets us traverse all the way through our app from
                      # the very top, which allows us access to any id. In this case we are accessing
                      # the content of our selected_list_view of our app
                      @property
                      def selected_list_content(self):
                          return App.get_running_app().root.ids.selected_list.ids.content
                  
                      # And in this case, we're accessing the content of our deselected_list_view
                      @property
                      def deselected_list_content(self):
                          return App.get_running_app().root.ids.deselected_list.ids.content
                  
                      # This is our callback that our Label's will call when pressed
                      def change_location(self):
                  
                          # If the label's parent is equal* the selected list, we remove the label from its
                          # parent, and then we add it to the other list
                          if self.parent == self.selected_list_content:
                              self.parent.remove_widget(self)
                              self.deselected_list_content.add_widget(self)
                  
                          # If the label's parent is not the selected list, then it is the deselected list
                          # so we remove it from its parent and add it to the selected list
                          else:
                              self.parent.remove_widget(self)
                              self.selected_list_content.add_widget(self)
                  
                      #* Note: Kivy uses weak references. This is why we use ==, and not 'is'
                  
                  # We create a CustomRecycleView that we will define in our kv file      
                  class CustomRecycleView(RecycleView):
                      pass
                  
                  class MainWindow(FloatLayout):
                      pass
                  
                  class ExampleApp(App):
                  
                      def build(self):
                          # We create an instance of the MainWindow class, so we can access its id
                          # to import our list. Otherwise we would have nothing to add the list too
                          main_window = MainWindow()
                          importedlist = ['Novella Varela', 'Caroll Faircloth', 'Douglas Schissler',
                                  'Rolande Hassell', 'Hayley Rivero', 'Niesha Dungy', 'Winfred Dejonge', 'Venetta Milum']
                  
                          # We create a Label for each Name in our imported list, and then add it
                          # to the content of selected list as a default
                          # I'm sure you'll be importing our own lists in a different manner
                          # This is just for the example
                          for name in importedlist:
                              NameLabel = ButtonLabel(text=(name))
                              main_window.ids.selected_list.ids.content.add_widget(NameLabel)
                          return main_window
                  
                  if __name__ == '__main__':
                      ExampleApp().run()
                  

                  kv 文件:

                  #:kivy 1.10.0
                  
                  # We create a reference to the ButtonLabel class in our py file
                  <ButtonLabel>:
                      # We add our callback to our ButtonLabels on press event, on_press
                      on_press: root.change_location()
                  
                  # We create a reference to our CustomRecycleView class in our py file
                  <CustomRecycleView>:
                      # We create a GridLayout to store all of the content in our RecycleView
                      GridLayout:
                          # We give it the id content so we can define the two property values in
                          # ButtonLabel class in the py file
                          id: content
                          size_hint_y: None
                  
                          # One column because we want it to be vertical list list
                          cols: 1
                  
                          # This set up, as well as size_hint_y set to None
                          # is so we can scroll vertically without issue
                          row_default_height: 60
                          height: self.minimum_height
                  
                  <MainWindow>:
                      # We then create two instances of our CustomRecycleView, give them the ids
                      # referenced by the ButtonLabel methods as well as give them equal share of the
                      # screen space so they do not step on each others toes
                      # The canvas here is just for prototyping purposes to make sure they are the
                      # properly defined sizes. You can do whatever with them you would like tbh.
                      CustomRecycleView:
                          id: selected_list
                          size_hint: 1, .5
                          pos_hint: {'x': 0, 'y': .5}
                          canvas:
                              Color:
                                  rgba: 100, 0, 0, .2
                              Rectangle:
                                  size: self.size
                                  pos: self.pos
                      CustomRecycleView:
                          id: deselected_list
                          size_hint: 1, .45
                          canvas:
                              Color:
                                  rgba: 0, 0, 100, .2
                              Rectangle:
                                  size: self.size
                                  pos: self.pos
                  

                  这篇关于每次数据更改时如何刷新kivy RecycleView?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:Matplotlib imshow 和 kivy 下一篇:如何使用 Kivy 的 FileChooser 选择多个文件?

                  相关文章

                    <bdo id='bd1Zl'></bdo><ul id='bd1Zl'></ul>

                    <small id='bd1Zl'></small><noframes id='bd1Zl'>

                    <legend id='bd1Zl'><style id='bd1Zl'><dir id='bd1Zl'><q id='bd1Zl'></q></dir></style></legend>
                    <tfoot id='bd1Zl'></tfoot>

                  1. <i id='bd1Zl'><tr id='bd1Zl'><dt id='bd1Zl'><q id='bd1Zl'><span id='bd1Zl'><b id='bd1Zl'><form id='bd1Zl'><ins id='bd1Zl'></ins><ul id='bd1Zl'></ul><sub id='bd1Zl'></sub></form><legend id='bd1Zl'></legend><bdo id='bd1Zl'><pre id='bd1Zl'><center id='bd1Zl'></center></pre></bdo></b><th id='bd1Zl'></th></span></q></dt></tr></i><div id='bd1Zl'><tfoot id='bd1Zl'></tfoot><dl id='bd1Zl'><fieldset id='bd1Zl'></fieldset></dl></div>