wxPython - 如何创建带有两个插入面板的单个框架?

wxPython - how to create a single frame with two inset panels?

我正在编写一个使用 wxPython 作为 GUI 的程序,我想做一些类似于(现在看起来已经过时的)传统 Windows 帮助部分的东西,tree/table左边的内容,一个垂直分隔线,以及你在右边的树中选择的任何页面的内容,树和信息都被插入到屏幕的斜角区域中。搜索完文档(和 SO)后,我似乎无法找到如何执行此操作的方法——但我知道这是可能的。我在这样的框架文档中看到过屏幕截图,但没有提供代码(屏幕截图不在与您如何完成此操作相关的页面上——我想说它在树视图页面上或东西)。

附件是我的目标截图。它不必像屏幕截图那样复杂,我只需要静态树的一般概念,甚至只是左侧的链接列表,更新右侧的内容,但两个面板都设置为斜面框架(在这个词的常识中)中间有一个竖线。

有人知道怎么做吗?

EDIT 因为人们似乎误解了这个问题。我不需要任何人编写代码来为我生成图像中那样的框架。我只是想知道在 wxPython 中是否有一种方法可以使面板看起来设置在框架中,就像图像中的树和内容部分一样。简单地将两个面板设置为一个框架是微不足道的,但是没有可见的边框,除非您在设置框架时将 border=somevalue 参数添加到 sizer.Add() 调用,然后 'divider' 只是一个没有吸引力的灰色地带。抱歉,我无法显示代码;如果我知道创建这样一个插图面板的代码,我就不会在这里了。我可以证明我知道如何将多个面板添加到单个框架并根据另一个面板中的处理程序捕获的事件动态更新一个面板,如果这有帮助的话,但我认为这不是特别相关。

您没有尝试向我们展示您为完成这项工作所做的工作。您的问题似乎是要求其他人为您完成所有工作。

这是一个简单的程序,它创建了两个面板,左边是树,右边是文本控件。剩下的就交给你了

import wx


class MainFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(None, *args, **kwargs)
        self.size = (400, 1000)
        self.Title = 'Two panels'

        self.help_panel = HelpPanel(self)
        self.index_panel = IndexPanel(self)
        panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
        panel_sizer.Add(self.help_panel, flag=wx.RIGHT, border=5)
        panel_sizer.Add(self.index_panel)
        main_sizer = wx.BoxSizer(wx.HORIZONTAL)
        main_sizer.Add(panel_sizer, flag=wx.ALL, border=5)
        self.SetSizer(main_sizer)
        self.Center()
        self.Show()


class IndexPanel(wx.Panel):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.tree = wx.TreeCtrl(self, size=(200,400),  style=wx.TR_DEFAULT_STYLE)
        sizer.Add(self.tree)
        self.SetSizer(sizer)


class HelpPanel(wx.Panel):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.tree = wx.TextCtrl(self, size=(200,400),  style=wx.TE_MULTILINE)
        sizer.Add(self.tree)
        self.SetSizer(sizer)


if __name__ == '__main__':
        wx_app = wx.App()
        MainFrame()
        wx_app.MainLoop()

根据我的评论,wx.SplitterWindow 可能最符合您的要求。
我的一个项目中的 SplitterWindow 示例:

它并没有完全复制您的示例,但它确实说明了事物的外观和感觉,一个 class 管理两个子 windows。