wxPython 导航面板(类似 Finder(Mac OS X)、Nautilus(Ubuntu)、Explorer(Windows 7))

4 投票
3 回答
3623 浏览
提问于 2025-04-17 05:16

我的问题很简单,如何制作一个类似于Finder(Mac OS X)的导航面板?

Finder

还有Explorer(Windows 7)

Windows Explorer

还有Nautilus(Ubuntu)

Nautilus

关于使用wx.TreeCtrl,这个方法不太好用……

举个例子

http://paste.pocoo.org/show/500311/

从上面可以看到,第一个问题是左边有一条很大的粉色条,无法去掉;第二个问题是只能在根目录下使用,否则你需要为隐藏的缓冲区留出更多空间;第三个问题是这个效果和上面三个例子都不太像。

那么,我该如何制作一个类似于上面例子的导航面板呢(除了树控件的例子 :p)

==== 更新 =====

在Windows(至少是Windows 7)上,左边没有白色的列的问题。

可能在Linux和MacOS X上,树控件的绘制方式比较通用……如果有人能在MacOS X上运行上面的例子,看看树控件左边是否有粉色的列(粉色是因为例子设置了背景颜色)。

==== 更新 2 =====

以iTunes为例

Navigation Bar Example

似乎对问题有一点误解,我并不是在寻找文件管理器的文件夹视图,而是想要一个导航面板。

比如iTunes也有这个,但它不是文件管理器,它们都有的特点是左边有一堆可以点击的“标签”,用来导航(例如在iTunes中,有音乐、电影、电视剧、听书、应用等都在库下)。

另外一个问题是,树控件在Linux上并不好用(见下图)

enter image description here

3 个回答

1

如果你用TR_TWIST_BUTTON样式来设置HyperTreeList控件,那它看起来会更像苹果的文件管理器。而且这个控件是纯Python写的,比普通的TreeCtrl更容易修改。如果你想要类似Windows资源管理器的外观,可以考虑使用ListCtrl、ObjectListView或者UltimateListCtrl。这些控件在wxPython的演示中都有示例(除了ObjectListView,因为它不包含在wxPython里)。

1

如果你真的想要浏览目录结构的话:

import os
import wx

class MainWindow(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

        self.panel = wx.Panel(self)
        self.dir = wx.GenericDirCtrl(self.panel, size=(200, -1), style=wx.DIRCTRL_DIR_ONLY)
        self.files = wx.ListCtrl(self.panel, style=wx.LC_LIST)

        self.sizer = wx.BoxSizer()
        self.sizer.Add(self.dir, flag=wx.EXPAND)
        self.sizer.Add(self.files, proportion=1, flag=wx.EXPAND)

        self.border = wx.BoxSizer()
        self.border.Add(self.sizer, 1, wx.ALL | wx.EXPAND, 5)

        self.panel.SetSizerAndFit(self.border)  
        self.Show()

        self.dir.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelect)


    def OnSelect(self, e):
        self.files.ClearAll()
        list = os.listdir(self.dir.GetPath())
        for a in reversed(list):
            self.files.InsertStringItem(0, a)


app = wx.App(False)
win = MainWindow(None, size=(600, 400))
app.MainLoop()

这里有一些有用的例子:

如果你只是想要一个类似的控件,可以看看 wx.lib.agw.customtreectrl。虽然它可能不是你想要的完全样子,但在wxpython里有这个控件的源代码,所以你可以根据自己的需求进行修改。

import wx
import wx.lib.agw.customtreectrl as CT

class MainWindow(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

        self.panel = wx.Panel(self)
        self.dir = CT.CustomTreeCtrl(self.panel, size=(100, -1), 
                                     style=wx.SUNKEN_BORDER,
                                     agwStyle=CT.TR_FULL_ROW_HIGHLIGHT | CT.TR_HIDE_ROOT | CT.TR_NO_LINES | CT.TR_ROW_LINES)           

        root = self.dir.AddRoot("The Root Item")
        child = self.dir.AppendItem(root, "Test")
        child = self.dir.AppendItem(child, "Test 2")
        child = self.dir.AppendItem(child, "Test 3")
        child = self.dir.AppendItem(root, "Test 4")

        self.dir.ExpandAll()

        self.sizer = wx.BoxSizer()
        self.sizer.Add(self.dir, proportion=1, flag=wx.EXPAND)

        self.border = wx.BoxSizer()
        self.border.Add(self.sizer, 1, wx.ALL | wx.EXPAND, 5)

        self.panel.SetSizerAndFit(self.border)  
        self.Show()


app = wx.App(False)
win = MainWindow(None, size=(200, 300))
app.MainLoop()
1

试试使用 Treebook

更新:

另外,可以尝试使用 wx.lib.agw.foldpanelbar。可以在演示套件中查看它的演示,根据你的实际需求,这可能已经足够了。如果不够,你也可以从头开始自己制作。

撰写回答