使用 Functools部分来 clear_widgets lambda 会工作吗

问题描述

我还是个新手。当我尝试运行代码时出现此错误。有人可以解释第三个论点的来源。是从循环吗?代码运行但 on_press 实际上产生了错误

lambda 会为此工作吗。

这是经过修正的完整代码。 kivy 被称为 main.kv

TypeError: clear_widgets() takes from 1 to 2 positional arguments but 3 were given   

现在的错误TypeError: 'Tab' object is not subscriptable

Python

class Main(MDApp):

def build(self):
    return

  def load_songs(self,storageLocation):
    songs = []
    #  dictionary = {}

    if Path('Books').is_dir():
        for filename in storageLocation.glob('**/*.wav'):
            songs.append(filename)
            # Create dictionary for each subfolder(Chapter)
        booksdir = [f for f in storageLocation.iterdir() if f.is_dir()]
        # for value,Bookfolders in enumerate(booksdir):
        for Bookfolders in booksdir:
            # if Bookfolders not in dictionary:
            # dictionary[Bookfolders] = []
            # dictionary[Bookfolders].append('yahoooooo')

            self.root.ids.Books.add_widget(
                OneLineListItem(text=str(Bookfolders),on_press=lambda olli: self.root.ids.tabs.clear_widgets(Tab(Bookfolders)),pos_hint={"center_x": 1,"center_y": 1},on_release=partial(self.root.ids.tabs.add_widget,Tab(title=str(Bookfolders)))))
            

    return songs


Main().run()




kivy

MDNavigationLayout:
    ScreenManager:
       Screen:
        #BooksScreen:
        #ChapterScreen:

        MDBoxLayout:
            orientation: "vertical"
            MDToolbar:
                title: "Chapters"
                font_style: "Caption"
                elevation:8
                left_action_items: [['menu',lambda x: nav_drawer.set_state("open")]]
                Widget:

            MDTabs:
                id: tabs

        mdscreen
            MDBoxLayout:
                orientation: "vertical"
                MDList
                    id: Books

    #Options menu
MDNavigationDrawer:
    id: nav_drawer
    MDBoxLayout:
        orientation: "vertical"
        padding: "8dp"
        spacing: "8dp"

<Tab>
MDList:
    MDBoxLayout:
        adaptive_height: True
        MDLabel:
            id: label
            text: "Tab 0" #Tab Text
            halign: "center"


        MDFlatButton:
            text: "ADD TAB"
            on_release: app.add_tab()


        MDFlatButton:
            text: "REMOVE LAST TAB"
            on_release: app.remove_tab()

        MDFlatButton:
            text: "GET TAB LIST"
            on_release: app.get_tab_list()

解决方法

on_press 回调将 on_press 事件的源添加到指定的回调,创建第三个参数。您可以像这样使用 lambda 处理第三个参数:

on_press= lambda olli: self.root.ids.tabs.clear_widgets(Tab)

olli 是作为 OneLineListItem 事件源的 press 实例,被 lambda 函数丢弃。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...