Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt4 - динамическое создание меню. Как задать функцию к элементам? [RSS Feed]

#1 Фев. 24, 2012 18:01:48

Barsah
От:
Зарегистрирован: 2012-02-24
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 - динамическое создание меню. Как задать функцию к элементам?

Народ, помогите! Запарился совсем.
Есть код для кнопки с выпадающим меню для выбора 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()
При запуске, не важно на каком пункте меню кликать, проигрывается только последний аудиофайл, а не тот, на котором кликнул. Смотрел в сторону yield, но тоже ничего не получилось. Все равно проигрывается только последний файл из списка. Пытался копать в сторону SIGNAL-SLOT, но не разобрался,
PS За код сильно не пинайте, в PyQt новичок). Python 3.2. И вообще можно ли таким образом создавать и управлять динамическим меню?



Офлайн

#2 Фев. 25, 2012 06:34:12

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 - динамическое создание меню. Как задать функцию к элементам?

Общий смысл такой: создаешь пустой список. В цикле по именам файлов mp3 в список добавляешь новый Action, добавляешь его к меню, и коннектишь к лямбде:

for file_name in <не разобрался в коде, здесь должен быть список имен файлов>:
actions.append(QtGui.QAction(<параметры>))
actions[:-1].triggered.connect(lambda: self.play(file_name))
self.menu.addAction(actions[:-1])
Смотри-разбирайся, пищу для размышлений я тебе дал:) и почитай какую-нибудь книжку по питону, а то пишешь то ли как на пыхе, то ли как на бацике:) самых основ не знаешь.



Офлайн

#3 Фев. 25, 2012 06:37:48

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 - динамическое создание меню. Как задать функцию к элементам?

PS. Список создавать даже не обязательно: можно новый Action в одну и туже переменную пихать, а ссылка на нее будет сохраняться в self.menu, просто я не помню как питон отнесется к такому перекидыванию.



Офлайн

#4 Фев. 25, 2012 13:30:04

Barsah
От:
Зарегистрирован: 2012-02-24
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 - динамическое создание меню. Как задать функцию к элементам?

Сразу дико извиняюсь, что буду тупить. :-( . Сама идея со списком понятна, но с реализацией не получилось. Я понимаю зачем нужно делать именно так

actions[:-1].triggered.connect(lambda: self.play())
но получаю AttributeError: ‘list’ object has no attribute ‘triggered’
Чтение умных книг не помогло, а если переписать код так:
 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()
Можно ли как-то обойти этот AttributeError? Заранее спасибо.



Офлайн

#5 Фев. 25, 2012 14:31:39

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 - динамическое создание меню. Как задать функцию к элементам?

Нууууууууу елки палки. Для начала попробуйте без списка, как я позднее заметил (так оно красивее:)). Затем поймите!! вот этим кодом

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)
Вы и задаете для каждого Action'a одинаковый обработчик.
А я просто перепутал (под рукой питона не было) что нужен не срез , а один элемент (нет двоеточия)



Офлайн

#6 Фев. 25, 2012 17:30:05

Barsah
От:
Зарегистрирован: 2012-02-24
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 - динамическое создание меню. Как задать функцию к элементам?

Внял совету. Написал такой код

 
for fileName in self.mp3files:
action = QtGui.QAction(fileName,self)
action.triggered.connect(lambda: print(fileName))
self.menu.addAction(action)
Получил тоже, что и сначала - печатается только последний элемент списка(с воспроизведением та же петрушка). Со всех сторон проверил код, никаких, вроде, ошибок. Тоже самое и при создании списка - нет никаких ошибок в коде и печатается только последний элемент. :(



Офлайн

  • Начало
  • » GUI
  • » PyQt4 - динамическое создание меню. Как задать функцию к элементам?[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version