0

我正在使用下面的代码来填充组合框。但是,当我运行我的应用程序时,它会检测指定路径中的所有媒体文件......如果我在应用程序运行时碰巧添加了另一个文件并尝试单击组合框的下拉按钮,项目列表在组合框中没有用最近添加的项目更新,这就是问题所在:

...
...
...
#Select Media path
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(".mkv") or filename.endswith(".m4v") 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))

...
...
....

经过一番阅读,我发现 wx.ComboBox 是 wxControlWithItems、wx.combo.ComboCtrl 和 wx.Choice 的子类,所以它也可以使用它们的方法。我找到了一种方法(OnButtonClick()),听起来它会做我需要做的事情 - 一旦单击下拉箭头,使用目录中的项目更新组合框列表。但是,没有关于如何使用它的描述。有人可以引导我朝着正确的方向前进。谢谢!

4

2 回答 2

2

您可以捕获组合框事件 'wx.EVT_COMBOBOX_DROPDOWN 并设置要显示的项目。

注意:WxPython 版本 2.9.5

•EVT_COMBOBOX_DROPDOWN(id, func):处理wxEVT_COMBOBOX_DROPDOWN 事件,该事件在组合框的列表框部分显示(下拉)时生成。请注意,目前只有 wxMSW 和 wxGTK 支持 GTK+ 2.10 或更高版本。

import wx


class Mainframe(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)
        panel = wx.Panel(self)
        self.count = 1

        self.combo_box = wx.ComboBox(panel, size=(140, -1),
            value='Select choice', choices=[])
        self.combo_box.Bind(wx.EVT_COMBOBOX_DROPDOWN, self.on_combo_drop)

    def on_combo_drop(self, event):
        self.combo_box.Set(['Item{}'.format(number) for
                            number in xrange(self.count, self.count + 5)])
        self.count += 5


if __name__ == '__main__':
    app = wx.App(False)
    frame = Mainframe(None)
    frame.Show()
    app.MainLoop()
于 2013-09-26T12:14:49.027 回答
1

真的没有办法捕捉你想要的事件。您可能需要创建自定义控件或改用 ComboCtrl。

有关一些想法,请参见以下线程:

于 2013-09-25T17:36:02.860 回答