TypeError:函数缺少4个必需的位置参数

时间:2016-07-17 09:37:29

标签: python kivy

我在调用类中的函数时遇到了问题。代码片段是:

    class CharacterGenerator(GridLayout):

        def printcharacter(self,my_sb,my_cr,my_scm,my_scb):
            printable_stats = print_stats(my_sb)
            printable_rolls = print_rolls(my_cr)
            printable_scm = print_scm(my_scm)
            printable_scb = print_scb(my_scb)

    #       self.clear_widgets()
            layout=BoxLayout(orientation='vertical')
            stat_box=(Label(text_size=(300, None),
                    text='Stats\n' + str(printable_stats)))
            rolls_box=(Label(text_size=(300, None),
                    text='Rolls\n' + str(printable_rolls)))
            scm_box=(Label(text_size=(300, None),
                    text='SCM\n' + str(printable_scm)))
            scb_box=(Label(text_size=(300, None),
                    text='SCB\n' + str(printable_scb)))

            layout.add_widget(stat_box)
            layout.add_widget(rolls_box)
            layout.add_widget(scm_box)
            layout.add_widget(scb_box)
            wayout = Button(text='Way Out')
            layout.add_widget(wayout)

        def human(self,a,b):
            if b==True: 
                self.Status="human"
                race=self.Status
                statblock = human()
                characteristic_rolls = rolls(statblock)
                skill_category_modifiers = scm(statblock)
                skill_category_bonuses = scb(statblock)
                CharacterGenerator.printcharacter         (self,     statblock, characteristic_rolls, skill_category_modifiers, skill_category_bonuses)

错误:

       File "./charactergenerator.kv", line 36, in <module>
         on_press: root.printcharacter()
     TypeError: printcharacter() missing 4 required positional arguments: 'my_sb', 'my_cr', 'my_scm', and 'my_scb'

据我所知,我正在向printcharacter函数发送正确的参数。相同的函数和调用在单独的python模块中使用printcharacter

我已经尝试了调用参数的所有组合,从列表中添加和删除了一些。如果没有CharacterGenerator.printcharacter来电,我得到的是CharacterGenerator has no object printcharacter和我回到原点的消息。

任何人都可以看到我出错的地方吗?

2 个答案:

答案 0 :(得分:0)

您的错误似乎出现在第36行的charactergenerator.kv中。

你可以在没有参数的情况下调用函数“on_press:root.printcharacter()”。

所以用参数调用函数。

并更改此行

def printcharacter(self,my_sb,my_cr,my_scm,my_scb):

def printcharacter(self,my_sb,my_cr,my_scm,my_scb,*args):

答案 1 :(得分:-1)

使用 self 来调用代码CharacterGenerator.printcharacter(self, ...中的函数 - 您没有将self作为第一个参数传递,因此正确的printcharacter调用假设为:

self.printcharacter(statblock, characteristic_rolls, skill_category_modifiers, skill_category_bonuses)

您可以在What is the purpose of self?上详细了解self

很短:如果您在没有staticmethodstaticclass装饰器的类定义中定义了方法,它会接受类实例方法作为第一个参数被调用(按照惯例,第一个参数名为self),该参数不应直接传递,因为它将在调用实例方法时自动传递。

我注意到printcharacter方法无法与self一起使用,因此您可以将其定义为staticmethod:

class CharacterGenerator(GridLayout):

    @staticmethod
    def printcharacter(my_sb,my_cr,my_scm,my_scb):
        # method body

然后调用它:

# within execution of instance method
self.printcharacter(statblock, characteristic_rolls, skill_category_modifiers, skill_category_bonuses)
# Anywhere outside class method 
CharacterGenerator.printcharacter(statblock, characteristic_rolls, skill_category_modifiers, skill_category_bonuses)