2012-03-25 8 views
0

別のコンボボックス1で選択されたアイテムに応じて、1つのコンボボックス2内のアイテムのリストを更新しようとしています。コンボボックスをアイテムのリストで更新する方法

たとえば、ユーザーがcombobox1でfile.mp3を選択すると、combobox2はオーディオ拡張子(.aac、.wav、.wma)のリストを表示します。ただし、ユーザーがcombobox1からfile.flvを選択すると、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 (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

は、2つのリストを保持するために辞書を使用します。次に、ユーザーが最初のウィジェットで何かをクリックすると、2番目のコンボボックスのSetItems(myDict [selection])メソッドなどをそれらの行に沿って呼び出すことができます。エラーメッセージは、サポートしていないCommandEventで何かをしようとしているためです。例えば、 "rfind"属性はありません。

EDIT:OPの投稿された新しいコードは、ORステートメントの前半に対するリストの理解のみを実行しているため動作しません。これは決して "ビデオ"部分に対して実行されないので、ユーザーがビデオ形式の拡張子を持つものを選択した場合は空のリストを返します。オーディオ選択を選択すると、WILLが機能します。

個人的には、ビデオの拡張子リストとオーディオリストを作成することをおすすめします。後で修正する必要がある場合は、将来的に理解しやすくなります。

+0

マイク、私はあなたのPythonの適性を羨む...私はそこに着くことに努力しています。私は適切なリソースを持っていないようです。 – suffa

+0

ちょうど時間と練習が必要です。あなたはそこに着くでしょう。 –

+0

私はあなたのコメントをはっきりと理解しています。しかし、そのアプローチは私のために働いていません。私のコードで間違っていることを教えてくれますか?新しいコードが投稿されました。 – suffa

関連する問題