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

Python TypeError:函数缺少4个必需的位置参数,python,kivy,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 = p

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

    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'
文件“/charactergenerator.kv”,第36行,中
按:root.printcharacter()
TypeError:printcharacter()缺少4个必需的位置参数:“my_sb”、“my_cr”、“my_scm”和“my_scb”
据我所知,我正在向
printcharacter
函数发送正确的参数。相同的函数和调用在单独的python模块中使用
printcharacter

我尝试了调用参数的所有组合,从列表中添加和删除了一些。如果没有
CharacterGenerator.printcharacter
调用,我得到的只是一条消息,即
CharacterGenerator没有对象printcharacter
,我回到了原点


有人能看出我哪里做错了吗

使用
self
调用函数,在code
CharacterGenerator.printcharacter(self,
)-您没有将self作为第一个参数传递,因此正确的
printcharacter
调用假定为:

self.printcharacter(statblock, characteristic_rolls, skill_category_modifiers, skill_category_bonuses)
您可以在上阅读有关
self
的更多信息

很快:如果您在类定义中定义了不带或装饰器的方法,它将接受调用类实例方法作为第一个参数(按照惯例,第一个参数称为
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)

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

在这里调用函数“on_press:root.printcharacter()”,不带参数

因此,使用参数调用函数

换一条线

def打印字符(self、my\u sb、my\u cr、my\u scm、my\u scb):


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

这是kv文件。我确实无法在此网站上获得正确的格式:(
:cols:2画布:颜色:rgb:.2,.2矩形:pos:self.pos大小:self.size标签:text:'Human'复选框:group:'race\u group'on_active:root.Human(*args)按钮:text:'Next'on_按:root.printcharacter()
你应该把它放在你的问题中。粘贴它,然后突出显示它,然后按ctrl+K从.kv文件调用时,什么应该
my_sb,my_cr,my_scm,my_scb
be。(当你按“Next”按钮时)?我使用了你的代码,并将函数def更改为
def printcharacter(my_sb,my_cr,my_scm,my_scb):
。现在我得到了错误:`TypeError:printcharacter()接受了4个位置参数,但给出了5个`ColinBrett Add@staticmethod decorator如果该函数不应使用
self
属性运行,我已经更新了答案。`我从未使用过静态方法。我尝试了`def@printcharacter(我的\sb、我的\cr、我的\u scm、我的\u scb):`但这给出了一个错误“无效语法”错误。@ColinBrett是的,有语法错误,请参阅我的部分答案以获得添加staticmethod Decorator的正确方法。这不是回答他的问题或解决错误。更像是关于静态方法的教程。我已将第36行更改为:
on\u press:root.printcharacter(statblock,characteristic,characteristic,rolls,skill,category,skill,category,bonus)
但是现在得到了错误'TypeError:printcharacter()接受了4个位置参数,但是有5个被赋予了'I把KV行36改回了
上的root.printcharacter()
,并且定义为
def printcharacter(my_sb,my_cr,my_scb,my_scb,*args):
。现在,我在printcharacter printable_stats=print_stats(my_sb)文件“/home/colin/PROJECTS/programming/pythondev/learn_python/kivy/brp_chargen\u 02/brp_stats.py”第50行的print_stats s s=s+stat+[“+str(mystats[stats])+”]中得到错误“File”brp_chargen.py,第26行。”TypeError:“CharacterGenerator”对象不可下标。“(PS,我没有降级您的第一个答案)@ColinBrett我没有说是你。无论如何,不要把.kv文件中的行改回来。只有带*args.BTW的那一行是我的sb、我的cr、我的scm、我的scb可以在你的kv文件中访问的。kv文件现在看起来像这样:root.printcharacter(statblock、characteristic rolls、skill\u category\u修饰符、skill\u category\u奖金)。函数def看起来像
def printcharacter(my_sb,my_cr,my_scm,my_scb):
。我得到错误:`File./charactergenerator.kv',第36行,on_press:root.printcharacter(statblock,character\u rolls,skill\u category\u修饰符,skill\u category\u奖金)NameError:name'statblock'未定义。KV文件中没有“可见”的变量(statblock、my_sb等)。我该怎么做?@ColinBrett答案是,
def printcharacter(self、my_sb、my_cr、my_scm、my_scb、*args):