Python pygame中的线程

Python pygame中的线程,python,multithreading,pygame,subprocess,Python,Multithreading,Pygame,Subprocess,我在Linux上用python和pygame编写了一个程序。我的问题是,当我调用在调制解调器上拨出的功能,然后发送消息时,程序会暂停,直到功能完成。我需要一种方法来子进程或线程化函数。我是python和pygame新手,所以这可能很简单,但我尝试过的一切都失败了 另外,我相信可能有一种更优雅的方式来处理声音和停顿。第一个睡眠为调制解调器提供通话时间。接下来的两个是单词和句子之间的自然停顿,最后一个是在调制解调器挂断之前给整个脚本时间来传递消息 我调用函数并传递如下变量: A = 'Electro

我在Linux上用python和pygame编写了一个程序。我的问题是,当我调用在调制解调器上拨出的功能,然后发送消息时,程序会暂停,直到功能完成。我需要一种方法来
子进程
或线程化函数。我是python和pygame新手,所以这可能很简单,但我尝试过的一切都失败了

另外,我相信可能有一种更优雅的方式来处理声音和停顿。第一个
睡眠
为调制解调器提供通话时间。接下来的两个是单词和句子之间的自然停顿,最后一个是在调制解调器挂断之前给整个脚本时间来传递消息

我调用函数并传递如下变量:

A = 'Electronic_Chime.mp3'
B = 'please_check.mp3'
C = 'three.mp3'

contact_user(A,B,C)
这就是功能:

def contact_user( A, B, C ):
  ser.write("ATDT441\r")  # Attention - Dial via tone number
  time.sleep(6)

  pygame.mixer.music.load(A)
  pygame.mixer.music.play()
  time.sleep(2)

  pygame.mixer.music.load(B)
  pygame.mixer.music.play(1)
  time.sleep(2)

  pygame.mixer.music.load(C)
  pygame.mixer.music.queue(C)
  pygame.mixer.music.play()

  time.sleep(10)
def contact_user(A,B,C):
  ser.write("ATDT411\r")  # Attention - Dial Tone 411
  time.sleep(5)  # Wait for modem to finish dialing
  pygame.mixer.music.load(A)
  pygame.mixer.music.play()  # Play attention chime
  time.sleep(2)  # Wait long enough for first message chime to play before moving on
  pygame.mixer.music.load(B)
  pygame.mixer.music.play(1) # Play next message
  time.sleep(2)  # Wait long enough for second message to play before moving on
  pygame.mixer.music.load(C) # Load last message
  pygame.mixer.music.queue(C)  # Queue second instance of last message
  pygame.mixer.music.play()  # Play last message twice
  time.sleep(10)  # Wait long enough for last message to play
  ser.write("ATH\r")  # Attention - Hang up line
  ser.write("ATZ\r")  # Attention - Reset modem
  ser.close()
如有任何意见或建议,将不胜感激

注:我试过:

thread1 = threading.Thread(contact_user(A,B,C))
thread1.start()

程序的行为似乎完全相同,尽管我已经线程化了
联系用户(A,B,C)

我的主要问题是没有正确地将参数传递给线程。以下是对我来说正常工作的代码

我的职能:

def contact_user( A, B, C ):
  ser.write("ATDT441\r")  # Attention - Dial via tone number
  time.sleep(6)

  pygame.mixer.music.load(A)
  pygame.mixer.music.play()
  time.sleep(2)

  pygame.mixer.music.load(B)
  pygame.mixer.music.play(1)
  time.sleep(2)

  pygame.mixer.music.load(C)
  pygame.mixer.music.queue(C)
  pygame.mixer.music.play()

  time.sleep(10)
def contact_user(A,B,C):
  ser.write("ATDT411\r")  # Attention - Dial Tone 411
  time.sleep(5)  # Wait for modem to finish dialing
  pygame.mixer.music.load(A)
  pygame.mixer.music.play()  # Play attention chime
  time.sleep(2)  # Wait long enough for first message chime to play before moving on
  pygame.mixer.music.load(B)
  pygame.mixer.music.play(1) # Play next message
  time.sleep(2)  # Wait long enough for second message to play before moving on
  pygame.mixer.music.load(C) # Load last message
  pygame.mixer.music.queue(C)  # Queue second instance of last message
  pygame.mixer.music.play()  # Play last message twice
  time.sleep(10)  # Wait long enough for last message to play
  ser.write("ATH\r")  # Attention - Hang up line
  ser.write("ATZ\r")  # Attention - Reset modem
  ser.close()
从主程序调用函数:

t = threading.Thread(name = 'dial', target = contact_user, args = (A,B,C))
t.start()

感谢所有在这方面帮助过我的人。非常感谢。

我不熟悉您正在尝试做什么,但我可以告诉您,您的最后一位代码尝试调用
线程。线程
,目标函数等于
的返回值contact_user(a,B,C)
。相反,请执行
thread1=threading.Thread(lambda:contact_user(A,B,C))
或使用
functools.partial
来构建函数(例如
thread1=threading.Thread(partial(contact_user,A,B,C))
),您是说我的主程序可能在继续之前等待返回值吗?还有,为什么是lambda:和partial?@AdamSmith:你应该把它作为答案发布。尽管线程调用仍然不正确。请参阅下面我的评论。@user72055:
f()
在Python调用函数
f
中。要推迟对另一个线程调用函数,请改用
thread(target=contact\u user,args=[A,B,C])
。此外,您应该避免在与其他
pygame
调用相同的函数中使用
time.sleep()
,而是安排一个操作(事件驱动方法)。例如,在
load(A)之后的
2
秒时不要睡觉;play()
您可以在2秒钟内调用stop
A
,以下是