0

Pyo および WX ライブラリに基づいて、Python で単純な信号発生器を構築しています。

それぞれの簡単なチュートリアルを実行し、WX のボタンを WX 関数に正常にバインドしました。「Oscillator 1」というラベルの付いたボタンを押して、単純な正弦波 (440 Hz) を 1 秒間生成しようとしています。ただし、main() 関数が実行されるとサイン トーンが再生され、ボタンが wx フレームに表示されている間はサイン トーンを再トリガーできません。これらの症状はどちらも望ましくありません。

プログラムを実行するとすぐにサイントーンが再生されるのはなぜですか? 最初の OSC ボタンが機能しないように見えるのはなぜですか?

import wx
from pyo import *
import time

pyoServer = Server().boot()  
pyoServer.start()

class MainWindow(wx.Frame):
    def __init__(self,parent,title):
        wx.Frame.__init__(self,parent,title=title, size = (640,640))
        self.CreateStatusBar() # A StatusBar in the bottom of the window        

        # Signal Generator controls
        oscillator = SoundOutput()
        firstOSC = wx.Button(self, wx.ID_YES,"Oscillator 1 " + str(oscillator.str_osc1State))
        self.Bind(wx.EVT_BUTTON, oscillator.OnOff1(440), firstOSC)

        #Menus
        filemenu = wx.Menu()
        menuExit = filemenu.Append(wx.ID_EXIT,"&Exit","Terminate the program")
        menuBar = wx.MenuBar()
        menuBar.Append(filemenu,"&File")
        self.SetMenuBar(menuBar)    
        self.Bind(wx.EVT_MENU, self.OnExit, menuExit)

        self.Show(True)
    def OnExit(self,e):
        self.Close(True)   


class SoundOutput(object):
    def __init__(self):
        self.osc1State = False
        self.str_osc1State = "Off"
        self.a = Sine(440, 0, 0.1)     
    def OnOff1(self, frequency):
        self.a.freq = frequency
        self.a.out()
        time.sleep(1)
        self.osc1State = True

def Main():
    app = wx.App(False)
    frame = MainWindow(None,"Signal Generator")
    app.MainLoop()
4

1 に答える 1

1

WX がイベントを処理する方法を調査することで、これを解決しました。結局のところ、何らかの理由で、クラスのネストされたインスタンスまたは別のインスタンスでメソッドを呼び出すと、イベントではなく実行時にトーンが再生されました。firstOSC のバインドされたイベント ハンドラーとして機能する MainWindow クラスのメソッドを作成することで、これを修正しました。次に、このメソッドは、実際のオシレーター クラスに必要なメソッドを呼び出します。

新しいコードは次のとおりです。

    # Signal Generator controls
    self.fOscillator = SoundOutput()
    self.fOscillatorstatus = False
    self.firstOSC = wx.Button(self, wx.ID_ANY,"Oscillator 1 On")
    self.firstOSC.Bind(wx.EVT_BUTTON, self.OnFirstOSC)

    def OnFirstOSC(self,e):
    if not self.fOscillatorstatus:
        self.fOscillator.OnOff1(440) 
        self.fOscillatorstatus = True
        self.firstOSC.SetLabel("Oscillator 1 Off")
    elif self.fOscillatorstatus:
        self.fOscillator.OnOff1(0)
        self.firstOSC.SetLabel("Oscillator 1 On")
        self.fOscillatorstatus = False
于 2012-11-22T23:34:40.943 に答える