2014-04-25 17 views
0

我正在使用Pygame和OSC编写Python脚本,它允许我通过在Pygame中执行操作来控制音乐跟踪器软件Renoise(版本3.0.0) (1.9.1)环境并通过OSC向软件发送消息。如果你想知道,这个剧本的目的是为了现场表演和创作音乐的创作。然而,我有一个非常烦人的问题:当我试图关闭Pygame窗口时,它只是挂起 - 甚至没有响应Control + C - 但只有在Renoise打开或至少打开一次在会议期间。如果我重新启动并在不打开Renoise的情况下运行脚本,它将按预期工作。这可能是什么问题?Python/Pygame脚本在关闭时没有响应,而Renoise已打开

我正在使用Python版本2.7.6,Pygame版本1.9.1和Renoise版本3.0.0。这些都在Xubuntu 14.04笔记本电脑上运行。

代码为我的主脚本(进口OSC模块仅仅是OSC.py可在很多地方on the internet):

#!/usr/bin/python 

import sys 
import pygame 
import OSC 
from pygame.locals import * 

class Pot: 
    def __init__(self, ip, port): 
     self.clk = pygame.time.Clock() 
     self.screen = pygame.display.set_mode((1600, 900)) 
     self.fillColor = pygame.Color(255,255,255) 
     pygame.display.set_caption("Pygame OSC Test") 

     self.client = OSC.OSCClient() 
     self.client.connect((ip, port)) 

    def oscsend(self, addr, *data): 
     msg = OSC.OSCMessage() 
     msg.setAddress("/renoise" + str(addr)) 
     for d in data: 
      msg.append(d) 
     try: 
      self.client.send(msg) 
     except OSC.OSCClientError, err: 
      print err 

    def tick(self): 
     # clear the screen 
     self.screen.fill(self.fillColor) 

     #TODO: other drawing stuff here 

     # process events 
     for event in pygame.event.get(): 
      if event.type == QUIT: 
       self.client.close() 
       del(self.client) 
       return False 

     pygame.display.update() 
     self.clk.tick(10) 

     return True 

if __name__ == "__main__": 
    p,f = pygame.init() 
    print "Num modules passed:", p 
    print "Num modules failed:", f 

    pot = Pot("localhost", 8000) 

    running = True 
    while running: 
     running = pot.tick() 

    pygame.quit() 
    sys.exit(0) 

回答

0

仔细一看后,编辑后的版本:程序辞去当你返回false。但变量“跑步”依然如此!你的循环仍在继续他的事业,并愉快地循环有...

我会这样改变它:

for event in pygame.event.get(): 
    if event.type == QUIT: 
     self.client.close() 
     del(self.client) 
     pygame.quit() 
     sys.exit() 

第二个选项:

return False 

更改这一部分是“运行“被设置为false。我会尽快与第一个选项。

如果这样不能解决问题,请让我知道,这将是一个有趣的问题,请仔细看看。

+0

哈哈,感谢捕捉,但不幸的是它并没有解决我的问题。计划仍然像以前一样行事。 – Holo

+0

啊,对不起,我明白了,明天再仔细看看这个问题。我必须在某处获得雷诺思 - 是免费的吗?否则,我不能真正尝试:/ –

+0

感谢帕特里克,但我设法找出我自己的问题。看到我对这篇文章的回答。 – Holo

1

我试图通过确保pygame.mixer未初始化来解决我的问题。我认为这是他们在同一时间使用声音硬件造成的Renoise问题。

为了只初始化pygame的某些模块,只需调用它们的初始化方法。例如,pygame.display.init()将初始化显示模块。调用pygame.init()只是初始化所有当前加载的模块的快捷方式。希望这可以帮助别人!

+0

这真的很好知道!我也经常将PyGame用于“非游戏”应用程序(它只提供了一些其他地方找不到的细节)。而且知道这可能会阻止未来的一系列问题。感谢你的分享! –