0

我正在使用 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)
4

2 回答 2

1

我设法通过确保pygame.mixer没有初始化来解决我的问题。我认为他们同时使用声音硬件会导致 Renoise 出现一些问题。

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

于 2014-04-25T22:38:57.343 回答
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的这部分。我会选择第一个选项。

如果这不能解决问题,请告诉我,这将是一个值得仔细研究的有趣问题。

于 2014-04-25T19:26:00.617 回答