Как обновить поле со списком элементов - PullRequest
0 голосов
/ 25 марта 2012

Я пытаюсь обновить список элементов в одном выпадающем списке 2 в зависимости от элемента, выбранного в другом выпадающем списке.

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

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

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

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 (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

1 Ответ

2 голосов
/ 26 марта 2012

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

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

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

...