Combobox 如何使用项目列表更新组合框

Combobox 如何使用项目列表更新组合框,combobox,event-handling,wxpython,Combobox,Event Handling,Wxpython,我正在尝试更新一个combobox2中的项目列表,具体取决于在另一个-Combox1中选择的项目 例如,如果用户在combobox1中选择file.mp3,则Combox2将显示音频扩展名(.aac、.wav、.wma)的列表。但是,如果用户从combobox1选择文件.flv,Combox2将显示视频扩展名列表(.mpg、mp4、.avi、.mov) 我最初认为我可以通过if语句来实现这一点。最初的选择是有效的,但是之后,如果继续选择不同的文件,combobox2不会更新。我尝试使用事件,但没

我正在尝试更新一个combobox2中的项目列表,具体取决于在另一个-Combox1中选择的项目

例如,如果用户在combobox1中选择file.mp3,则Combox2将显示音频扩展名(.aac、.wav、.wma)的列表。但是,如果用户从combobox1选择文件.flv,Combox2将显示视频扩展名列表(.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 (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

使用字典保存这两个列表。然后,当用户单击第一个小部件中的某些内容时,您可以调用第二个组合框的SetItems(myDict[selection])方法或类似的方法。错误消息是因为您试图使用CommandEvent执行它不支持的操作。例如,它们没有“rfind”属性

编辑:OP发布的新代码不起作用,因为它只对OR语句的前半部分运行列表理解。它从不针对“视频”部分运行,因此如果用户选择任何具有视频格式扩展名的内容,它将返回一个空列表。如果您选择音频选择,它将起作用


就个人而言,我建议创建一个视频扩展列表和一个音频列表。如果您以后需要修复它,这将更容易理解。

Mike,我羡慕您的Python天赋。。。我正在努力去那里。我似乎没有合适的资源,只是需要时间和练习。你会成功的。我清楚地理解你的评论。但是,这种方法对我不起作用。你能告诉我我的代码哪里做错了吗。新代码已发布。我已更新代码。当我选择一个.mp3文件时,它会列出与音频相关的扩展名。然而,当我选择一个.mp4文件时,它会给我一个超出索引范围的错误列表?不用担心。。。我想出来了。谢谢