我正在使用 Pygame 和 OSC 编写一个 Python 脚本,它允许我通过在 Pygame (1.9.1) 环境中执行操作并通过 OSC 向软件发送消息来控制音乐跟踪器软件 Renoise(版本 3.0.0)。如果您想知道,此脚本的目的是用于现场表演和生成音乐创作。但是,我遇到了一个非常烦人的问题:当我尝试关闭 Pygame 窗口时,它只是挂起 - 甚至不响应 Control+C - 但这只有在 Renoise 打开或至少打开一次时才会发生会议期间。如果我在不打开 Renoise 的情况下重新启动并运行脚本,它会按预期工作。这里可能是什么问题?
我正在使用 Python 2.7.6 版、Pygame 1.9.1 版和 Renoise 3.0.0 版。这一切都在 Xubuntu 14.04 笔记本电脑上运行。
我的主脚本的代码(导入的 OSC 模块只是 OSC.py 在互联网上的许多地方都可用):
#!/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)