gpt4 book ai didi

python - wxPython按钮加载多个图像

转载 作者:行者123 更新时间:2023-12-01 05:50:07 25 4
gpt4 key购买 nike

对了,有一个背景故事。在我的大学项目中,我正在为鼓创建一名节奏老师。因此,程序要做的就是加载鼓乐谱以及与该鼓乐谱匹配的音频文件。用户按下“播放”按钮,它会播放与乐谱相匹配的短鼓节拍。到目前为止,我已经有了一个播放加载的 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()

最佳答案

这是一种方法:

  • 首先,定义全局变量来定义目录包含图像和 wav 文件:

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

    如果您愿意,可以使用相同的目录。我假设

    • 所有图像都是以 .jpg 结尾的 JPEG 文件
    • 如果图像名为 foo.jpg 则关联的 wav 文件为名为 foo.wav
  • 接下来,在 window2.__init__ 方法中定义两个新属性:

    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返回一个循环遍历列表中的项目的迭代ad无限。

    next(self.images)返回可迭代对象中的项目self.images 一次一张——每次调用都会有不同的一张下一步。我们将在下面使用它。

  • 现在,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()

关于python - wxPython按钮加载多个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14610228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com