2017-05-08 7 views
-1

は、私は(私のプログラムでは、それより良いフィットするので)_threadモジュールを使用していると私は私がスレッドに渡している関数に関数を渡したい*引数に関数を渡します。しかし、タプルだけを_thread.start_new_thread()関数に渡すことは可能ですが、関数は反復可能ではありません!のPython 3:


@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) 

出力:

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 
+4

tuple(func)を使用しましたか? –

+0

アンダースコアで始まるものは使用しないでください。それは何かを「保護された」とマークするPythonの方法であり、開発者はその動作が変化しないことを保証しません。 – gonczor

+0

@gonczor推奨されていませんが、ネストされたクラスを定義したくないので、まだ使用しています。コードの可読性が低下します。 docsから: "スレッドモジュールは、その非推奨のために_threadで名前が変更されました"。 –

答えて

-1

私は考え出しました。 _thread、実際はが悪いです。コードを書き直しました - 今はthreadingを使用しています!


は、私はそれはあなたが入力し、エラーメッセージ/期待される出力との例を与えることができるなど、あなたが達成したいものを私には本当にはっきりしていない代わりにtuple((func,))