1

そう、裏話。私の大学のプロジェクトでは、ドラムのリズム教師を作成しています。したがって、プログラムが実行するのは、ドラム表記と、そのドラム表記に一致するオーディオファイルをロードすることです。ユーザーが「再生」ボタンを押すと、表記に一致する短いドラムビートが再生されます。これまでのところ、ロードされたWavを再生するためのボタンがあります。ファイル、および画像をロードするための別のボタン。私は理にかなっていると思います。

だから私の質問は、誰かがこれを行う機能を持っていますか?のように、画像と音声ファイルを一緒にロードするためのボタン。また、ボタンをもう一度押すと、別の画像と音声ファイルが読み込まれ、以前に読み込まれたものがすべて上書きされます。かなりの量の画像と音声ファイルをロードします。重要な点は、画像がオーディオファイルと一致する必要があるということです。

繰り返しになりますが、オーディオファイルを再生するボタンと、画像をロードするだけのボタンがあります(私は初心者であり、これらの機能の実行方法を学んでいたため、これを実行しました。

とにかくコードを投稿します、そしてそれはもっと理にかなっているはずです!長い間読んでしまったらごめんなさい!自分がやっていることについて裏話をするつもりだった。

import wxversion
wxversion.select("2.8")
import wx
import wx.media

class MainWindow(wx.Frame):

    title = "Main Menu"

    def __init__(self, parent, id):
     wx.Frame.__init__(self,parent,id,'Window', size=(1000,700))
     panel=wx.Panel(self, -1)

     self.SetBackgroundColour(wx.Colour(100,100,100))
     self.Centre()
     self.Show()

     status=self.CreateStatusBar()

     menubar=wx.MenuBar()
     filemenu=wx.Menu()
     exitmenu = filemenu.Append(wx.NewId(),"Exit", "Exit Program")

     menubar.Append(filemenu,"File")
     self.Bind(wx.EVT_MENU, self.onExit, exitmenu)
     self.SetMenuBar(menubar)

     font1 = wx.Font(30, wx.MODERN, wx.NORMAL, wx.NORMAL, False, u'Consolas')

     Text1=wx.StaticText(panel, -1, "Rhythm Trainer", (10,15))
     Text1.SetFont(font1)
     Text1.SetForegroundColour('white')

     btn1 = wx.Button(panel, label='Basic', pos=(100,200), size=(150, 50))
     btn1.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))

     self.Bind(wx.EVT_BUTTON, self.newwindow, btn1)

     btn2 = wx.Button(panel, label='Advanced', pos=(100,270), size=(150, 50))
     btn2.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))

     btn3 = wx.Button(panel, label='Notations', pos=(100,340), size=(150, 50))
     btn3.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))

     btn4 = wx.Button(panel, label='Settings', pos=(100,410), size=(150, 50))
     btn4.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))

     btn5 = wx.Button(panel, label="Quit", pos=(820, 550), size=(150, 50))
     btn5.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))
     self.Bind(wx.EVT_BUTTON, self.OnClick, btn5)

    def OnClick(self, event):
     self.Close()

    def OnQuitButton(self, event):
     wx.Sleep(1)   
     self.Destroy()

    def onExit(self, event):
     self.Destroy()

    def newwindow(self, event):
     secondWindow=window2(parent=None, id=-1)
     secondWindow.Show()

class window2(wx.Frame):

    title = "new Window"

    def __init__(self, parent, id):
     wx.Frame.__init__(self, parent, id, 'Window2', size=(1000,700))
     panel=wx.Panel(self, -1)

     self.SetBackgroundColour(wx.Colour(100,100,100))
     self.Centre()
     self.Show()

     status=self.CreateStatusBar()

     menubar=wx.MenuBar()
     filemenu=wx.Menu()
     exitmenu = filemenu.Append(wx.NewId(),"Exit", "Exit Program")

     menubar.Append(filemenu,"File")
     self.Bind(wx.EVT_MENU, self.onExit, exitmenu)
     self.SetMenuBar(menubar)

     font2 = wx.Font(30, wx.MODERN, wx.NORMAL, wx.NORMAL, False, u'Consolas')

     Text2=wx.StaticText(panel, -1, "Rhythm Trainer", (10,15))
     Text2.SetFont(font2)
     Text2.SetForegroundColour('white')
     self.Show(True)

     btn1 = wx.Button(panel, label="Back", pos=(820, 550), size=(150, 50))
     btn1.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))
     self.Bind(wx.EVT_BUTTON, self.OnClick, btn1)

     btn2 = wx.Button(panel, label="Play", pos=(820, 100), size=(150, 50))
     btn2.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))
     self.Bind(wx.EVT_BUTTON, self.onPlaySound, btn2)

     btn3 = wx.Button(panel, label="Stop", pos=(820, 150), size=(150, 50))
     btn3.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))
     self.Bind(wx.EVT_BUTTON, self.onStopSound, btn3)

     btn4 = wx.Button(panel, label="Next", pos=(820, 200), size=(150, 50))
     btn4.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))
     self.Bind(wx.EVT_BUTTON, self.loadImage, btn4)
     self.panel = wx.Panel(self, -1, pos=(50,50), size=(800, 200))

    def loadImage(self, event):
      image_file = 'Rock-beats.jpg'
      bmp = wx.Image(image_file, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
      wx.StaticBitmap(self.panel, -1, bmp, pos=(200, 50), size=(417, 133))



     # def onNext(self, event):
        """
        Calls the nextPicture method
        """
        #self.nextPicture()

    def onPlaySound (self, event):
      sound = wx.Sound('Test3.wav')
      sound.Play(wx.SOUND_ASYNC)

    def onStopSound(self, event):
     wx.Sound.Stop()

    def onExit(self, event):
      self.Destroy()
      wx.Sound.Stop()

    def OnClick(self, event):
      wx.Sound.Stop()
      self.Close()

if __name__=='__main__':
 app=wx.PySimpleApp()
 frame=MainWindow(parent=None,id=-1)

Unutbuのコード2.0-これが私の完全な実行可能なコードです-

import wxversion
#wxversion.select("2.8")
import wx
import wx.media
import itertools as IT
import os

IMAGE_DIR = './'
SOUND_DIR = './'

class MainWindow(wx.Frame):

    title = "Main Menu"

    def __init__(self, parent, id):
     wx.Frame.__init__(self,parent,id,'Window', size=(1000,700))
     panel=wx.Panel(self, -1)

     self.SetBackgroundColour(wx.Colour(100,100,100))
     self.Centre()
     self.Show()

     status=self.CreateStatusBar()

     menubar=wx.MenuBar()
     filemenu=wx.Menu()
     exitmenu = filemenu.Append(wx.NewId(),"Exit", "Exit Program")

     menubar.Append(filemenu,"File")
     self.Bind(wx.EVT_MENU, self.onExit, exitmenu)
     self.SetMenuBar(menubar)

     font1 = wx.Font(30, wx.MODERN, wx.NORMAL, wx.NORMAL, False, u'Consolas')

     Text1=wx.StaticText(panel, -1, "Rhythm Trainer", (10,15))
     Text1.SetFont(font1)
     Text1.SetForegroundColour('white')

     btn1 = wx.Button(panel, label='Basic', pos=(100,200), size=(150, 50))
     btn1.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))

     self.Bind(wx.EVT_BUTTON, self.newwindow, btn1)

     btn2 = wx.Button(panel, label='Advanced', pos=(100,270), size=(150, 50))
     btn2.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))

     btn3 = wx.Button(panel, label='Notations', pos=(100,340), size=(150, 50))
     btn3.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))

     btn4 = wx.Button(panel, label='Settings', pos=(100,410), size=(150, 50))
     btn4.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))

     btn5 = wx.Button(panel, label="Quit", pos=(820, 550), size=(150, 50))
     btn5.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))
     self.Bind(wx.EVT_BUTTON, self.OnClick, btn5)

    def OnClick(self, event):
     self.Close()

    def OnQuitButton(self, event):
     self.Destroy()

    def onExit(self, event):
     self.Destroy()

    def newwindow(self, event):
     secondWindow=window2(parent=None, id=-1)
     secondWindow.Show()
     self.Close()

 class window2(wx.Frame):

    title = "new Window"

    def __init__(self, parent, id):
     wx.Frame.__init__(self, parent, id, 'Window2', size=(1000,700))
     panel=wx.Panel(self, -1)
     self.images = IT.cycle([filename for filename in os.listdir(IMAGE_DIR) if filename.endswith('.jpg')])
     self.image_file = None
     #self.images = IT.cycle(os.listdir(IMAGE_DIR))
     #self.image_file = next(self.images)    

     self.SetBackgroundColour(wx.Colour(100,100,100))
     self.Centre()
     self.Show()

     status=self.CreateStatusBar()

     menubar=wx.MenuBar()
     filemenu=wx.Menu()
     exitmenu = filemenu.Append(wx.NewId(),"Exit", "Exit Program")

     menubar.Append(filemenu,"File")
     self.Bind(wx.EVT_MENU, self.onExit, exitmenu)
     self.SetMenuBar(menubar)

     font2 = wx.Font(30, wx.MODERN, wx.NORMAL, wx.NORMAL, False, u'Consolas')

     Text2=wx.StaticText(panel, -1, "Rhythm Trainer", (10,15))
     Text2.SetFont(font2)
     Text2.SetForegroundColour('white')
     self.Show(True)

     btn1 = wx.Button(panel, label="Back", pos=(820, 550), size=(150, 50))
     btn1.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))
     self.Bind(wx.EVT_BUTTON, self.OnClick, btn1)

     btn2 = wx.Button(panel, label="Play", pos=(820, 100), size=(150, 50))
     btn2.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))
     self.Bind(wx.EVT_BUTTON, self.onPlaySound, btn2)

     btn3 = wx.Button(panel, label="Stop", pos=(820, 150), size=(150, 50))
     btn3.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))
     self.Bind(wx.EVT_BUTTON, self.onStopSound, btn3)

     btn4 = wx.Button(panel, label="Next", pos=(820, 200), size=(150, 50))
     btn4.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))
     self.Bind(wx.EVT_BUTTON, self.loadImage, btn4)
     self.panel = wx.Panel(self, -1, pos=(50,50),  size=(1000, 180))



    def loadImage(self, event):
      #image_file = 'Rock-beats.jpg'
      #bmp = wx.Image(image_file, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
      #wx.StaticBitmap(self.panel, -1, bmp, pos=(200, 50), size=(417, 133))
       self.image_file = next(self.images)
       image_file = os.path.join(IMAGE_DIR, self.image_file)
       bmp = wx.Image(image_file, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
       width = bmp.GetWidth()
       height = bmp.GetHeight()
       wx.StaticBitmap(self.panel, -1, bmp, pos=(200, 50), size=(width, height))
       wx.Sound.Stop()
       print(self.image_file)

     # def onNext(self, event):
     #"""
     # Calls the nextPicture method
     # """
     #self.nextPicture()

    def onPlaySound (self, event):
      #sound = wx.Sound('Test3.wav')
      #sound.Play(wx.SOUND_ASYNC)
       sound_file, ext = os.path.splitext(self.image_file)
       sound_file = os.path.join(SOUND_DIR, sound_file + '.wav')
       sound = wx.Sound(sound_file)
       sound.Play(wx.SOUND_ASYNC) 
       print(sound_file) 
       def onStopSound(self, event):
       wx.Sound.Stop()

    def onExit(self, event):
      self.Destroy()
      wx.Sound.Stop()

    def OnClick(self, event):
      wx.Sound.Stop()
      self.Close()
      mainwindow=MainWindow(parent=None, id=-1)
      mainwindow.Show()

if __name__=='__main__':
 app=wx.PySimpleApp()
 frame=MainWindow(parent=None,id=-1)
 frame.Show()
 app.MainLoop()   
4

1 に答える 1

2

これがあなたがそれをすることができる1つの方法です:

  • まず、画像とwavファイルを含むディレクトリを定義するグローバル変数を定義します。

    IMAGE_DIR = '/path/to/images'
    SOUND_DIR = '/path/to/sounds'
    

    必要に応じて、同じディレクトリを使用できます。私はそれを仮定するつもりです

    • すべての画像は、で終わるJPEGファイルです.jpg
    • 画像が呼び出されるとfoo.jpg、関連するwavファイルが呼び出されfoo.wavます。
  • 次に、window2.__init__メソッドで2つの新しい属性を定義します。

    self.images = IT.cycle([filename for filename in os.listdir(IMAGE_DIR) if filename.endswith('.jpg')])
    self.image_file = None
    

    ファイルの先頭で、itertoolsモジュールをインポートします。

    import itertools as IT
    

    os.listdir(IMAGE_DIR)ファイル名のリストを返します。IT.cycle は、リスト内のアイテムを無限に循環する反復可能オブジェクト返します。

    next(self.images)は、反復可能なアイテムを self.images一度に1つずつ返します。これは、を呼び出すたびに異なる アイテムnextです。以下でこれを使用します。

  • さて、loadImageこのように書かれるかもしれません:

    def loadImage(self, event):
        self.image_file = next(self.images)
        image_file = os.path.join(IMAGE_DIR, self.image_file)
        bmp = wx.Image(image_file, wx.BITMAP_TYPE_ANY).ConvertToBitmap()
        wx.StaticBitmap(self.panel, -1, bmp, pos=(200, 50), size=(417, 133))
    

関連するwavファイルを再生するには:

   def onPlaySound(self, event):  
        sound_file, ext = os.path.splitext(self.image_file)
        sound_file = os.path.join(SOUND_DIR, sound_file + '.wav')
        sound = wx.Sound(sound_file)
        sound.Play(wx.SOUND_ASYNC)

os.path.joinos.path.splitextが使用されているため、ファイルの先頭にもモジュールをインポートしてくださいos


提案された変更とともに投稿したコードは次のとおりです。

import wxversion
wxversion.select("2.8")
import wx
import wx.media

import itertools as IT
import os

IMAGE_DIR = os.path.expanduser('~/tmp/images')
SOUND_DIR = os.path.expanduser('~/tmp/sounds')


class MainWindow(wx.Frame):

    title = "Main Menu"

    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, 'Window', size=(1000, 700))
        panel = wx.Panel(self, -1)
        self.SetBackgroundColour(wx.Colour(100, 100, 100))
        self.Centre()
        self.Show()

        status = self.CreateStatusBar()

        menubar = wx.MenuBar()
        filemenu = wx.Menu()
        exitmenu = filemenu.Append(wx.NewId(), "Exit", "Exit Program")

        menubar.Append(filemenu, "File")
        self.Bind(wx.EVT_MENU, self.onExit, exitmenu)
        self.SetMenuBar(menubar)

        font1 = wx.Font(
            30, wx.MODERN, wx.NORMAL, wx.NORMAL, False, u'Consolas')

        Text1 = wx.StaticText(panel, -1, "Rhythm Trainer", (10, 15))
        Text1.SetFont(font1)
        Text1.SetForegroundColour('white')

        btn1 = wx.Button(panel, label='Basic', pos=(100, 200), size=(150, 50))
        btn1.SetFont(
            wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))

        self.Bind(wx.EVT_BUTTON, self.newwindow, btn1)

        btn2 = wx.Button(
            panel, label='Advanced', pos=(100, 270), size=(150, 50))
        btn2.SetFont(
            wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))

        btn3 = wx.Button(
            panel, label='Notations', pos=(100, 340), size=(150, 50))
        btn3.SetFont(
            wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))

        btn4 = wx.Button(
            panel, label='Settings', pos=(100, 410), size=(150, 50))
        btn4.SetFont(
            wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))

        btn5 = wx.Button(panel, label="Quit", pos=(820, 550), size=(150, 50))
        btn5.SetFont(
            wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))
        self.Bind(wx.EVT_BUTTON, self.OnClick, btn5)

    def OnClick(self, event):
        self.Close()

    def OnQuitButton(self, event):
        wx.Sleep(1)
        self.Destroy()

    def onExit(self, event):
        self.Destroy()

    def newwindow(self, event):
        secondWindow = Window2(parent=None, id=-1)
        secondWindow.Show()
        self.Close()


class Window2(wx.Frame):

    title = "new Window"

    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, 'Window2', size=(1000, 700))
        panel = wx.Panel(self, -1)

        self.SetBackgroundColour(wx.Colour(100, 100, 100))
        self.Centre()
        self.Show()

        status = self.CreateStatusBar()

        menubar = wx.MenuBar()
        filemenu = wx.Menu()
        exitmenu = filemenu.Append(wx.NewId(), "Exit", "Exit Program")

        menubar.Append(filemenu, "File")
        self.Bind(wx.EVT_MENU, self.onExit, exitmenu)
        self.SetMenuBar(menubar)

        font2 = wx.Font(
            30, wx.MODERN, wx.NORMAL, wx.NORMAL, False, u'Consolas')

        Text2 = wx.StaticText(panel, -1, "Rhythm Trainer", (10, 15))
        Text2.SetFont(font2)
        Text2.SetForegroundColour('white')
        self.Show(True)

        btn1 = wx.Button(panel, label="Back", pos=(820, 550), size=(150, 50))
        btn1.SetFont(
            wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))
        self.Bind(wx.EVT_BUTTON, self.OnClick, btn1)

        btn2 = wx.Button(panel, label="Play", pos=(820, 100), size=(150, 50))
        btn2.SetFont(
            wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))
        self.Bind(wx.EVT_BUTTON, self.onPlaySound, btn2)

        btn3 = wx.Button(panel, label="Stop", pos=(820, 150), size=(150, 50))
        btn3.SetFont(
            wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))
        self.Bind(wx.EVT_BUTTON, self.onStopSound, btn3)

        btn4 = wx.Button(panel, label="Next", pos=(820, 200), size=(150, 50))
        btn4.SetFont(
            wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, u'Consolas'))
        self.Bind(wx.EVT_BUTTON, self.loadImage, btn4)
        self.panel = wx.Panel(self, -1, pos=(50, 50), size=(800, 200))

        self.images = IT.cycle(
            [filename for filename in os.listdir(IMAGE_DIR)
             if any(filename.lower().endswith(ext) 
                    for ext in ('.png', '.jpg', '.jpeg'))])
        self.image_file = next(self.images)

        img = wx.EmptyImage(240,240)
        self.imageCtrl = wx.StaticBitmap(self.panel, wx.ID_ANY, 
                                         wx.BitmapFromImage(img), pos=(200, 50))

    def loadImage(self, event):
        self.image_file = next(self.images)
        print(self.image_file)
        image_file = os.path.join(IMAGE_DIR, self.image_file)
        img = wx.Image(image_file, wx.BITMAP_TYPE_ANY)
        img = img.Scale(240,240)
        # The idea of using imageCtrl.SetBitmap comes from
        # http://www.blog.pythonlibrary.org/2010/03/26/creating-a-simple-photo-viewer-with-wxpython/
        self.imageCtrl.SetBitmap(wx.BitmapFromImage(img))

    def onPlaySound(self, event):
        sound_file, ext = os.path.splitext(self.image_file)
        sound_file = os.path.join(SOUND_DIR, sound_file + '.wav')
        print(sound_file)
        sound = wx.Sound(sound_file)
        sound.Play(wx.SOUND_ASYNC)

    def onStopSound(self, event):
        wx.Sound.Stop()

    def onExit(self, event):
        self.Destroy()
        wx.Sound.Stop()

    def OnClick(self, event):
        wx.Sound.Stop()
        self.Close()

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = MainWindow(parent=None, id=-1)
    app.MainLoop()
于 2013-01-30T19:25:17.117 に答える