Python3:将函数传递到*args

2024-05-18 18:22:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是_thread模块(因为它更适合我的程序),我想把一个函数传递给我要传递给线程的函数。但是,可以只将元组传递到_thread.start_new_thread()函数中,但是,函数是不可iterable的!你知道吗


@Willem Van Onsem-这是完整的代码。使用Pygame。你知道吗

class PGMaster:
    """
    Properties:
    mainloopOn - exits program if False

    Functions:
    PGMaster.mainlooprunner()
        Repeatedly runs Main function (must be overrided).
    PgMaster.mainloop(subthread=False)
        Wrapper for mainlooprunner. Subthread - will it run under MainThread? No if True.
    """

    def winmode(self, dimensions, flags=0, caption='', depth=None):
        """
        Flags are:
        pygame.FULLSCREEN    create a fullscreen display
        pygame.DOUBLEBUF     recommended for HWSURFACE or OPENGL
        pygame.HWSURFACE     hardware accelerated, only in FULLSCREEN
        pygame.OPENGL        create an OpenGL-renderable display
        pygame.RESIZABLE     display window should be sizeable
        pygame.NOFRAME       display window will have no border or controls
        """
        if depth != None:
            screenx = self.screen = pygame.display.set_mode(dimensions, flags, depth)
        elif depth == None:
            screenx = self.screen = pygame.display.set_mode(dimensions, flags)
        pygame.display.set_caption(caption)
        return screenx

    def __init__(self, dimensions, flags=0, caption='', depth=None):
        self.winmode(dimensions, flags, caption, depth)
        self.mainloopOn = True


    def mainlooprunner(self, function):
        func = function
        while self.mainloopOn:
            func()

    def mainlooprunnerx(self, *function):
        func = function[0]
        while self.mainloopOn:
            func()

    def mainloop(self, func, subthread=False):
        if subthread:
            functuple = tuple(func)
            _thread.start_new_thread(self.mainlooprunnerx, functuple)
        elif not subthread:
            self.mainlooprunner(func)
    . . .

if __name__ == '__main__':
    root = PGMaster([1600, 900], pygame.DOUBLEBUF | pygame.RESIZABLE)
    # vvv Real codes vvv
    print(pygame.FULLSCREEN)
    print(pygame.DOUBLEBUF)
    print(pygame.HWSURFACE)
    print(pygame.OPENGL)
    print(pygame.RESIZABLE)
    print(pygame.NOFRAME)
    # ^^^ Real codes ^^^

    def myloop():
        print('Hello World!')
        return
    root.mainloop(myloop, True)

Output:

Traceback (most recent call last):
  File "C:\Users\User\Desktop\PyGameUI\__init__.py", line 127, in <module>
    root.mainloop(myloop, True)
  File "C:\Users\User\Desktop\PyGameUI\__init__.py", line 100, in mainloop
    functuple = tuple(func)
TypeError: 'function' object is not iterable

Tags: 函数selfifdefdisplayfunctionthreadpygame

热门问题