2012-03-25 3 views
0

Я пытаюсь обновить список элементов в одном combobox2 в зависимости от выбранного в другом элементе - combobox1.Как обновить список со списком

Например, если пользователь выбирает файл.mp3 в combobox1, тогда combobox2 отобразит список расширений звука (.aac, .wav, .wma). Однако, если пользователь выберет файл.flv из combobox1, combobox2 отобразит список расширений видео (.mpg, mp4, .avi, .mov).

Первоначально я думал, что смогу выполнить это с помощью заявлений if. Начальный выбор работает, но после этого, если вы продолжаете выбирать разные файлы, combobox2 не обновляется. Я попытался использовать событие, но это не сработало.

Ниже, если очень урезанная версия кода, так что вы можете получить суть: ошибка

import wx 
import os 
import sys 
import time 
from wx.lib.delayedresult import startWorker 

class udCombo(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, -1, 'd-Converter', size=(500, 310)) 
     panel = wx.Panel(self, wx.ID_ANY)#Creates a panel over the widget 
     toolbar = self.CreateToolBar() 
     toolbar.Realize() 

     font = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD) 
     font2 = wx.Font(7, wx.DECORATIVE, wx.NORMAL, wx.NORMAL) 

     directory = wx.StaticText(panel, -1, 'Path to media files: c:\\ffmpeg\\bin', (300, 13)) 
     directory.SetFont(font2) 

     convertfile = wx.StaticText(panel, -1, 'File:', (270, 53)) 
     convertfile.SetFont(font) 

     convertfile2 = wx.StaticText(panel, -1, 'Format:', (245, 83)) 

     #Select Media 
     os.chdir("c:\\ffmpeg\\bin") 
     wrkdir = os.getcwd() 
     filelist = os.listdir(wrkdir) 
     self.formats1 = [] 

     for filename in filelist: 
      (head, filename) = os.path.split(filename) 
      if filename.endswith(".avi") or filename.endswith(".mp4") or filename.endswith(".flv") or filename.endswith(".mov") or filename.endswith(".mpeg4") or filename.endswith(".mpeg") or filename.endswith(".mpg2") or filename.endswith(".wav") or filename.endswith(".mp3"): 
       self.formats1.append(filename) 
     self.format_combo1=wx.ComboBox(panel, size=(140, -1),value='Select Media', choices=self.formats1, style=wx.CB_DROPDOWN, pos=(300,50)) 

     self.Bind(wx.EVT_COMBOBOX, self.fileFormats, self.format_combo1) 

     self.format_combo2=wx.ComboBox(panel, size=(100, -1),pos=(300,81)) 
     self.Bind(wx.EVT_COMBOBOX, self.fileFormats, self.format_combo2) 

    def fileFormats(self, e): 
    myFormats = {'audio': ('.wav', '.wma', '.mp3'), 'video': ('.mpg', '.mp4', '.mpeg')} 
    bad_file = ['Media not supported'] 
    myFile = self.format_combo1.GetValue() 
    f_exten = [x for x in myFormats['audio'] or myFormats['video'] if myFile.endswith(x)] 


    if f_exten[0] in myFormats['audio']: 
     self.format_combo2.SetItems(myFormats['audio']) 

    elif f_exten[0] in myFormats['video']: 
     self.format_combo2.SetItems(myFormats['video']) 
    else: 
     self.format_combo2.SetItems(bad_file) 


if __name__ == '__main__': 
    app = wx.PySimpleApp() 
    frame = udCombo() 
    frame.SetSizeHints(500,310,500,310) 
    frame.Show() 
    app.MainLoop() 

Traceback:

Traceback (most recent call last): 
File "C:\Users\GVRSQA004\Desktop\udCombo.py", line 86, in fileFormats 
if f_exten[0] in myFormats['audio']: 
IndexError: list index out of range 

ответ

2

Используйте словарь для хранения двух списков. Затем, когда пользователь нажимает что-то в первом виджете, вы можете вызвать второй метод SetItems (myDict [selection]) со списком combobox или что-то в этом направлении. Сообщение об ошибке связано с тем, что вы пытаетесь сделать что-то с CommandEvent, который он не поддерживает. Например, у них нет атрибута «rfind».

РЕДАКТИРОВАТЬ: Новый код, опубликованный OP, не работает, поскольку он выполняет только проверку списка в первой половине инструкции OR. Он никогда не работает против части «видео», поэтому он возвращает пустой список, если пользователь выбирает что-либо с расширением видеоформата. Это WILL Работает, если вы выберете выбор звука.

Лично я бы рекомендовал создать список расширения видео и список аудио. Это будет легче понять в будущем, если вам нужно будет исправить это позже.

+0

Майк, я завидую твоим способностям на Питоне ... Я стремлюсь туда добраться. Кажется, у меня нет необходимых ресурсов. – suffa

+0

Это требует времени и практики. Вы доберетесь туда. –

+0

Я четко понимаю ваш комментарий. Но этот подход не работает для меня. Можете ли вы рассказать мне, что я делаю неправильно в своем коде. Добавлен новый код. – suffa

Смежные вопросы