Pygame midi阻止了其他输入

时间:2014-08-17 22:41:00

标签: python-2.7 slider wxpython pygame midi

我希望有实时midi输入,以便控制一些wx.Sliders。我已经能够实现这一点,但它可以防止通过鼠标或键盘与滑块交互并导致应用程序崩溃。

这是我目前的代码。

import wx, pygame, pygame.midi

class windowClass(wx.Frame):
    def __init__(self, *args, **kwargs): 
        super(windowClass, self).__init__(*args, **kwargs) 
        self.basicGUI()

    def basicGUI(self):
        panel = wx.Panel(self) 
        self.slider = wx.Slider(panel, -1, 2, 0, 128, pos=(10,25), size=(250,-1), style=wx.SL_AUTOTICKS | wx.SL_LABELS)
        sliderText = wx.StaticText(panel, -1, 'Slider 1 ', (8,8))
        self.slider2 = wx.Slider(panel, -1, 2, 0, 128, pos=(10,110), size=(250,-1), style=wx.SL_AUTOTICKS | wx.SL_LABELS)
        sliderText = wx.StaticText(panel, -1, 'Slider 2', (8,88))
        self.Bind(wx.EVT_SLIDER, self.sliderUpdate)
        self.SetTitle('Sliders Window!')
        self.Show(True)

        pygame.init()
        pygame.midi.init()
        inp = pygame.midi.Input(1)
        running = True
        while running:
            if inp.poll():
                dataset = inp.read(1)
                control = dataset[0][0][1]
                if control > 8:
                    continue
                if control == 1:
                    value = dataset[0][0][2]
                    self.slider.SetValue(value)
                if control == 2:
                    value = dataset[0][0][2]
                    self.slider2.SetValue(value)
            pygame.time.wait(10)

    def sliderUpdate(self, event):
        value1 = self.slider1.GetValue()
        value2 = self.slider2.GetValue()
        print value1, value2

def main():
    app = wx.App()
    windowClass(None)
    app.MainLoop()

main()

是什么导致pygame.midi占用所有资源?我觉得它与while running = True有关,但我试图关闭该实例的尝试似乎不起作用。

如何让midi和鼠标调用sliderUpdate来控制滑块?谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

你有一个永不退出的循环,所以你的程序永远不会到达处理除midi输入之外的任何东西的部分

我会将当前在该循环中的代码移动到一个函数中,删除循环,并向面板添加一个计时器,例如

def basicGUI(self):
    ... panel stuff

    pygame.init()
    pygame.midi.init()
    timer = wx.Timer(self, -1)
    self.Bind(wx.EVT_TIMER, self.OnTimer)
    timer.Start(10, False)

def OnTimer(self, event):
    inp = pygame.midi.Input(1)
    if inp.poll():
        dataset = inp.read(1)
        control = dataset[0][0][1]
        if control > 8:
            continue
        if control == 1:
            value = dataset[0][0][2]
            self.slider.SetValue(value)
        if control == 2:
            value = dataset[0][0][2]
            self.slider2.SetValue(value)