【问题标题】:How to take text value of a kivymd list inside a recycleview?如何在recycleview 中获取kivymd 列表的文本值?
【发布时间】:2021-11-21 00:00:08
【问题描述】:

我是使用 kivymd 的新手,我需要生成一个有两个屏幕的应用程序,第二个屏幕在回收视图中显示一个 TwoLineListItem,我需要绑定一个函数,该函数将所选行上的文本放入主窗口的文本字段,但我收到此错误:

TypeError:click_supplier() 缺少 1 个必需的位置参数:'supplier_list_item'

这是我的代码的类似示例:

一年

from kivy.lang import Builder
from kivymd.app import MDApp
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.uix.list import OneLineListItem, TwoLineListItem
from kivy.uix.recycleview import RecycleView
from kivy.metrics import dp

suppliers=['Amazon', 'Ebay', 'Alibaba', 'Linio', 'Aliexpress']
suppliers_id=['198', '283', '343', '454', '203']


class MainWindow(Screen):
    pass

class SelectSupplierWindow(Screen):
    pass


class BrisaWindowManager(ScreenManager):
    pass


class MainApp(MDApp):

    #define build parameters
    product_dialog=None
    selected_products_list=[]
    def build(self):
        self.theme_cls.theme_style="Light"
        self.theme_cls.primary_palette="Green"
        return Builder.load_file('example.kv')


    def go_to_screen(self, screen):
        self.root.current=screen

    #start suppliers list
    def on_start(self):

        self.set_list_of_suppliers()

    #Autofill supplier search field--------------------------------------------------
    def set_list_of_suppliers(self, text="", search=False):


        def add_supplier_item(name_supplier):
            self.root.get_screen('select_supplier').ids.suppliers_rv.data.append(
                {
                    "viewclass": "TwoLineListItem",
                    "text": name_supplier,
                    "secondary_text": f'Code: {suppliers_id[suppliers.index(name_supplier)]}',
                    "on_release": self.click_supplier,
                }
            )

        self.root.get_screen('select_supplier').ids.suppliers_rv.data = []
        for name_supplier in suppliers:
            if search:
                if text.lower() in name_supplier.lower():
                    add_supplier_item(name_supplier)
            else:
                add_supplier_item(name_supplier)




    def click_supplier(self, supplier_list_item):
        self.root.get_screen('main').ids.oc_supplier.text=supplier_list_item.text
        self.go_to_screen('main')


MainApp().run()

千伏

BrisaWindowManager:
    MainWindow:
        id:main_window
    SelectSupplierWindow:

<MainWindow>
    name: 'main'
    MDBoxLayout:
        orientation: 'vertical'
        MDToolbar:
            title: 'Brisa'
        MDBottomNavigation:
            MDBottomNavigationItem:
                id: oc_screen
                name: 'screen 1'
                text: 'Purchase'
                icon: 'clipboard-list'

                MDBoxLayout:
                    orientation: 'vertical'
                    padding:dp(20)
                    spacing: dp(15)

                    MDTextField:
                        id: oc_supplier
                        hint_text: 'Select'
                        helper_text: 'Select'
                        helper_text_mode: 'on_focus'
                        mode: 'fill'
                        halign:'center'
                        on_focus:
                            app.root.current='select_supplier'
                            root.manager.transition.direction='up'

            MDBottomNavigationItem:
                name: 'screen 2'
                text: 'Check'
                icon: 'truck-check'


<SelectSupplierWindow>
    name:'select_supplier'
    MDBoxLayout:
        orientation: 'vertical'
        MDToolbar:
            title: 'Select'
            left_action_items: [['arrow-left', lambda x: app.go_to_screen(screen='main'), 'back']]
        MDBoxLayout:
            orientation:'vertical'
            spacing: dp(10)
            padding: dp(20)
            MDBoxLayout:
                adaptive_height:True

                MDIconButton:
                    icon: 'magnify'
                MDTextField:
                    id: search_field
                    on_text: app.set_list_of_suppliers(self.text, True)
            RecycleView:
                id: suppliers_rv
                key_viewclass: 'viewclass'
                key_size: 'height'
                RecycleBoxLayout:
                    padding: dp(10)
                    default_size: None, dp(60)
                    default_size_hint: 1, None
                    size_hint_y: None
                    height: self.minimum_height
                    orientation: 'vertical'

因为点击项函数需要被点击的行但我一直无法将此事件绑定到函数而触发错误。

【问题讨论】:

    标签: python kivy kivymd


    【解决方案1】:

    如何将您的add_supplier_item() 方法更改为:

        def add_supplier_item(name_supplier):
            self.root.get_screen('select_supplier').ids.suppliers_rv.data.append(
                {
                    "viewclass": "TwoLineListItem",
                    "text": name_supplier,
                    "secondary_text": f'Code: {suppliers_id[suppliers.index(name_supplier)]}',
                    "on_release": partial(self.click_supplier, name_supplier),
                }
            )
    

    还有你的click_supplier() 方法:

    def click_supplier(self, supplier_list_item):
        self.root.get_screen('main').ids.oc_supplier.text=supplier_list_item
        self.go_to_screen('main')
    

    与其尝试传递项目,不如传递文本。

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 2021-08-24
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      相关资源
      最近更新 更多