Форум сайта python.su
Народ, помогите! Запарился совсем.
Есть код для кнопки с выпадающим меню для выбора mp3 файла. Выпадающее меню по идее должно формироваться динамически, т.е количество строк в нем зависят от количества файлов в директории.
Код выглядит так:
import Phonon.phonon
import glob, os, sys
from PyQt4 import QtCore, QtGui
# Здесь идет основной код ----------------------------------------------------
self.choose = QtGui.QPushButton(self.chooseIcon,'Выбрать аудиофайл ')
self.menu = QtGui.QMenu()
self.mp3path = 'mp3/'
if os.path.isdir(self.mp3path):
self.mp3files = glob.glob(self.mp3path + '\*.mp3')
self.mp3s = os.listdir('mp3/')
self.actions = list(map(lambda x:'self.i'+str(x), range(len(self.mp3files))))# эту хрень придумал, надеясь сформировать функции на лету.
for each in range(len(self.mp3files)):
self.actions[each] = QtGui.QAction(self.mediaIcon,self.mp3files[each],self)
self.menu.addAction(self.actions[each])
self.connect(self.actions[each],QtCore.SIGNAL('triggered()'),self.adding)
# Дальнейший код----------------------------------------------------------------
def adding(self):
for each in self.mp3files:
self.media.setCurrentSource(Phonon.MediaSource(each))
self.media.play()
Офлайн
Общий смысл такой: создаешь пустой список. В цикле по именам файлов mp3 в список добавляешь новый Action, добавляешь его к меню, и коннектишь к лямбде:
for file_name in <не разобрался в коде, здесь должен быть список имен файлов>:
actions.append(QtGui.QAction(<параметры>))
actions[:-1].triggered.connect(lambda: self.play(file_name))
self.menu.addAction(actions[:-1])
Офлайн
PS. Список создавать даже не обязательно: можно новый Action в одну и туже переменную пихать, а ссылка на нее будет сохраняться в self.menu, просто я не помню как питон отнесется к такому перекидыванию.
Офлайн
Сразу дико извиняюсь, что буду тупить. :-( . Сама идея со списком понятна, но с реализацией не получилось. Я понимаю зачем нужно делать именно так
actions[:-1].triggered.connect(lambda: self.play())
for fileName in self.mp3files:
actions.append(QtGui.QAction(fileName,self))
for action in actions:
action.triggered.connect(lambda: self.media.setCurrentSource(Phonon.MediaSource(fileName)))
self.menu.addAction(action)
#-*- coding:utf-8 -*-
from PyQt4 import QtCore, QtGui
from PyQt4.phonon import Phonon
import os, sys, glob
class Widget(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
'''Инициализация фонона'''
self.output = Phonon.AudioOutput(Phonon.MusicCategory)
self.media = Phonon.MediaObject()
Phonon.createPath(self.media, self.output)
self.menu = QtGui.QMenu() # выпадающее меню для кнопки
self.mp3path = 'mp3'
if os.path.isdir(self.mp3path):
self.mp3files = glob.glob(self.mp3path + '\*.mp3')
actions = []
for fileName in self.mp3files:
actions.append(QtGui.QAction(fileName,self))
'''Попытка №2'''
#for action in actions:
# action.triggered.connect(lambda: self.media.setCurrentSource(Phonon.MediaSource(each)))
# self.menu.addAction(action)
'''AttributeError'''
actions[:-1].triggered.connect(lambda: self.media.setCurrentSource(Phonon.MediaSource(fileName)))
self.menu.addAction(actions[:-1])
self.choose = QtGui.QPushButton('Выбрать аудиофайл ',self) # Кнопка выбора
self.choose.setGeometry(25,25,125,25)
self.choose.setMenu(self.menu)
self.play = QtGui.QPushButton('play',self)# Кнопка играть
self.play.setGeometry(25,55,125,25)
self.play.clicked.connect(self.playIt)
def playIt(self):
'''Воспроизводит добавленный лямбдой файл'''
self.media.play()
def main():
app = QtGui.QApplication(sys.argv)
window = Widget()
window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
Офлайн
Нууууууууу елки палки. Для начала попробуйте без списка, как я позднее заметил (так оно красивее:)). Затем поймите!! вот этим кодом
for fileName in self.mp3files:
actions.append(QtGui.QAction(fileName,self))
for action in actions:
action.triggered.connect(lambda: self.media.setCurrentSource(Phonon.MediaSource(fileName)))
self.menu.addAction(action)
Офлайн
Внял совету. Написал такой код
for fileName in self.mp3files:
action = QtGui.QAction(fileName,self)
action.triggered.connect(lambda: print(fileName))
self.menu.addAction(action)
Офлайн