wxPython按钮可加载多个图像
对,一个背景故事。为了我的大学项目,我正在为鼓创作一位节奏老师。所以程序将要做的是加载一个鼓符号,以及一个与鼓符号匹配的音频文件。用户按下“播放”按钮,它播放一个与符号匹配的短鼓点。到目前为止,我已经有一个按钮来播放加载的Wav。文件,以及另一个用于加载图像的按钮。我希望我说的有道理 所以我的问题是,有没有人有这样一个函数?在中,一种按钮,用于同时加载图像和音频文件。如果再次按下按钮,它将加载另一个图像和音频文件,覆盖以前加载的内容。我将有相当数量的图像和音频文件加载。重要的一点是,图像必须与音频文件匹配 同样,我有一个播放音频文件的按钮,另一个只是加载图像的按钮(我这样做是因为我是新手,刚刚学习如何实现这些功能) 不管怎样,我会发布一段代码,它应该更有意义!抱歉,如果这是一段很长的阅读!我只是想把我正在做的事情放在后面wxPython按钮可加载多个图像,python,image,button,wxpython,Python,Image,Button,Wxpython,对,一个背景故事。为了我的大学项目,我正在为鼓创作一位节奏老师。所以程序将要做的是加载一个鼓符号,以及一个与鼓符号匹配的音频文件。用户按下“播放”按钮,它播放一个与符号匹配的短鼓点。到目前为止,我已经有一个按钮来播放加载的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)
代码2.0用于Unutbu-以下是我的完整可运行代码-
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'
- 所有图像都是以
结尾的JPEG文件.jpg
- 如果图像名为
,则关联的wav文件为 调用foo.jpg
foo.wav
- 所有图像都是以
- 接下来,在
方法中定义两个新属性:窗口2.\uuuu init\uuuu
在文件顶部,导入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
返回文件名列表 返回循环遍历列表中的项的iterable 无穷大 返回iterable中的项os.listdir(IMAGE\u DIR)
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))
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
模块
以下是您发布的代码以及建议的更改:
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()
您如何知道下一张图片的文件名是什么,以及它与哪个
.wav
文件关联?好吧,我将根据它们的名称来命名。示例图像和.wav文件将被称为“notation1”等等。但这可能是主要的问题,将它们加载在一起。我只是想问一下是否有人有这样做的想法。我很困惑,我是Python.notation1.wav,notation1.jpgI的新手,一直在搜索如何做。但通常谷歌搜索只会返回“位图按钮”等等。我对你描述的行为有点困惑。原因如下:当你按下Next
按钮时,loadImage
方法会运行。这个方法只会更改图像,不会播放任何声音。那么,“按下Next按钮只会加载下一个.wav文件”怎么可能。这里有一个建议:在loadImage
方法中放入print(self.image\u文件)
,然后放入print(sound\u文件)
在onPlaySound
方法中。这可能会给我们一个线索,说明当按下Next
和Play
按钮时会发生什么。如果这还不能充分说明情况,请发布完整的代码。我无法重现您描述的行为。我正在发布我正在使用的代码。请我想我可能终于看到问题了。我们不应该在面板中插入越来越多的图像,而应该只插入一次,然后调用SetBitmap
来更改图像。我已经更新了我的帖子这似乎不起作用,因为我刚刚得到一个错误-img=img.Scale(240240)UnboundLocalError:赋值前引用的局部变量“img”