关于python:TypeError:缺少1个必需的位置参数:’Caption’

TypeError: Missing 1 required positional argument: 'Caption'

所以我有2个.py文件:

  • FWY发动机

  • Py

  • 在fw_engine.py中,我有以下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import pygame

    pygame.init()

    class Display:

      def __init__(self, window, button):
          self.window = window
          self.button = button

      def Window(self, WindowWidth, WindowHeight, Caption):
          GameDisplay = pygame.display.set_mode((WindowWidth, WindowHeight))
          pygame.display.set_caption(Caption)


      def Button(self, DisplayWindow, Position_X, Position_Y):
          GreyColor = (96, 96, 96)
          pygame.draw.rect(DisplayWindow, GreyColor, (Position_X, Position_Y, 100, 20))

    在test.py中,我有以下代码:

    1
    2
    3
    4
    5
    6
    from FW_Engine import Display
    import pygame

    pygame.init()

    GameDisplay = Display.Window(800, 600,"TestTitle")

    我不断地得到这个错误:

    1
    TypeError: Window() missing 1 required positional argument: 'Caption'

    但正如您所看到的,我在函数调用中提供了所有3个必需的参数。怎么了?

    编辑:两个.py文件在同一目录中。


    问题是,您试图调用Display.Window,就好像它是一个静态方法(即不需要实例),但它不是。因为它需要一个实例,所以缺少一个参数(您提供的3个参数向左移动,即self800等),因此没有按照错误提示提供Caption

    您有两种选择:

  • Display实例调用Window

    1
    Display(window, button).Window(800, 600,"TestTitle")

    另一种不太可取的方法是将Display实例传递给Display.Window

    1
    2
    display = Display(window, button)
    Display.Window(display, 800, 600,"TestTitle")
  • 由于Display.Window根本不引用self,因此它可以是一个静态方法,因此其余代码将按原样工作:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Display:
        def __init__(self, window, button):
            self.window = window
            self.button = button

       @staticmethod
       def Window(WindowWidth, WindowHeight, Caption):
           GameDisplay = pygame.display.set_mode((WindowWidth, WindowHeight))
           pygame.display.set_caption(Caption)

  • Window方法不是静态方法,它是实例方法,因此在不实例化显示对象的情况下不能调用它。

    window方法的第一个参数是self,它应该引用您创建的对象,在本例中,它是display对象。

    但实际上你没有实例化它,所以当你调用window方法时,你缺少自变量,这就是你看到typeerror的原因。

    尝试如下使用,创建显示对象后调用window方法。

    1
    GameDisplay = Display(window, button).Window(800, 600,"TestTitle")