约束 wxPython MultiSplitterWindow 窗格

2024-02-28

Edit:我将问题保留原样,因为这仍然是一个好问题,而且答案可能对其他人有用。但是,我会注意到我找到了一个实际的解决方案my通过使用完全不同的方法来解决问题AuiManager;看到answer https://stackoverflow.com/a/17837040/564181 below.

我正在研究一个MultiSplitterWindow设置(花了很多时间之后 奋力对抗SashLayoutWindow布局怪癖)。不幸的是,当我 创建一个MultiSplitterWindow,拖动时我看到一些意外的行为 周围窗扇:可以将窗扇拖到包含窗口的外部 布局的方向。至少可以说,这是我想避免的行为。

这是基本设置(您可以在 wxPython 中确认以下行为 演示,只是替换leftwin for Panel1等,另请参阅下面的示例应用程序)。我在哪里有RootPanel/BoxSizer,有一个面板 (或者Frame,或者任何你喜欢的容器元素)BoxSizer到其中MultiSplitterWindow再次添加,如演示中所示。

+--------------------------------+
|       RootPanel/BoxSizer       |
|+------------------------------+|
||     MultiSplitterWindow      ||
||+--------++--------++--------+||
||| Panel1 || Panel2 || Panel3 |||
|||        ||        ||        |||
||+--------++--------++--------+||
|+------------------------------+|
+--------------------------------+

当你拖动时,你可能会得到这样的结果,其中~ and !表明该面板“存在”但未显示:

+--------------------------------+
|       RootPanel/BoxSizer       |
|+-------------------------------|~~~~~~~~~~~~~+
||           MultiSplitterWindow |             !
||+-----------------++-----------|~~++~~~~~~~~+!
|||      Panel1     ||   Panel2  |  !! Panel3 !!
|||                 ||           |  !!        !!
||+-----------------++-----------|~~++~~~~~~~~+!
|+-------------------------------|~~~~~~~~~~~~~+
+--------------------------------+

如果此时您将RootPanel比 整体面板集,您将再次看到所有面板。同样,如果你拖动 宽度回到Panel1,您可以访问窗扇Panel3再次(假设Panel2当然,还不算太宽)。而且,这 正是检查工具报告的情况:RootPanel保持其大小,但MultiSplitterWindow增长超过RootPanel/BoxSizer.

使用检查工具进一步检查发现虚拟宽度和客户端宽度值均为 0,但实际大小值为negative(通过将其拖出窗口的相应像素数)每当它超出范围时。再说一次,这是一种疯狂的行为;我无法想象为什么有人会ever想要一个窗口有这样的行为。

现在,如果有人按住Shift所以这样_OnMouse中的方法MultiSplitterWindow调整邻居,这种情况不会发生。因此,我的一位 方法是简单地覆盖该方法。它有效,但我更愿意 如果绝对必要的话,可以这样重写方法。还有其他更好的方法吗 解决这个问题?这似乎不是预期或可取的 一般行为,所以我想有一个标准的方法来修复它。

我尝试过的其他事情:

  • Checking whether the sum of the values in the MultiWindowSplitter exceeds the width of the containing window, using each of the EVT_SPLITTER_SASH_POS_CHANGED AND EVT_SPLITTER_SASH_POS_CHANGING events, and then trying to fix the issue by:
    • 使用event.Veto() call
    • 使用SetSashPosition()分离器上的方法
  • 覆盖_OnMouse()方法使用通常的行为 与按住有关Shift钥匙。这可行,但最终结果是 给我其他我不喜欢的结果。
  • 通过设置最小窗格尺寸SetMinimumPaneSize method
  • 设置最大尺寸MultiSplitterWindow via SetMaxSize()
  • Setting the maximum size on RootPanel/BoxSizer using both SetMaxSize() and SetSizeHints() on the RootPanel.
    • 我什至用事件处理程序来完成此操作wx.EVT_SIZE在容器上,以便RootPanel always具有来自父框架元素的适当的最大尺寸
    • 我尝试了相同的事件处理方法MultiSplitterWindow,也没有效果。

版本信息

我已经确认这会出现在 Windows 32 位和 OS X 64 位中,并且 wxPython 的最新快照版本,针对 Python 2.7 和 3.3。

工作示例(包含检查工具)

以下内容基本上重复(并稍微简化)了演示源代码。这是问题的有效演示。

import wx, wx.adv
import wx.lib.mixins.inspection as wit
from wx.lib.splitter import MultiSplitterWindow


class AppWInspection(wx.App, wit.InspectionMixin):
    def OnInit(self):
        self.Init()  # enable Inspection tool
        return True


class MultiSplitterFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(size=(800, 800), *args, **kwargs)
        self.SetMinSize((600, 600))

        self.top_sizer = wx.BoxSizer(orient=wx.HORIZONTAL)
        self.SetSizer(self.top_sizer)

        self.splitter = MultiSplitterWindow(parent=self, style=wx.SP_LIVE_UPDATE)
        self.top_sizer.Add(self.splitter, wx.SizerFlags().Expand().Proportion(1).Border(wx.ALL, 10))

        inner_panel1 = wx.Panel(parent=self.splitter)
        inner_panel1.SetBackgroundColour('#999980')
        inner_panel1_text = wx.StaticText(inner_panel1, -1, 'Inner Panel 1')
        inner_panel1.SetMinSize((100, -1))

        inner_panel2 = wx.Panel(parent=self.splitter)
        inner_panel2.SetBackgroundColour('#999990')
        inner_panel2_text = wx.StaticText(inner_panel2, -1, 'Inner Panel 2')
        inner_panel2.SetMinSize((100, -1))
        inner_panel2.SetMaxSize((100, -1))

        inner_panel3 = wx.Panel(parent=self.splitter)
        inner_panel3.SetBackgroundColour('#9999A0')
        inner_panel3_text = wx.StaticText(inner_panel3, -1, 'Inner Panel 3')
        inner_panel3.SetMinSize((100, -1))

        self.splitter.AppendWindow(inner_panel1)
        self.splitter.AppendWindow(inner_panel2)
        self.splitter.AppendWindow(inner_panel3)

if __name__ == '__main__':
    app = AppWInspection(0)
    frame = MultiSplitterFrame(parent=None, title='MultiSplitterFrame Test')
    app.SetTopWindow(frame)
    frame.Show()
    app.MainLoop()

根据需要的目的,可以使用一种可能的选项来代替自定义管理MultiSplitterWindow (or SashLayoutWindow组合等)是高级用户界面套件的AuiManager工具(Phoenix 之前版本的文档here http://wxpython.org/docs/api/wx.aui.AuiManager-class.html;凤凰文档here http://www.wxpython.org/Phoenix/docs/html/lib.agw.html#module-lib.agw). AuiManager为您自动化处理很多此类事情。就我而言,我试图使用MultiSplitterWindow作为控制相关 UI 的可折叠和可调整大小面板的一种方式,因此AuiManager非常适合:它已经内置了我需要的所有控件和约束。

在这种情况下,人们需要做的就是创建一个AuiManager实例

(我将其留在这里an回答,希望其他可能采取与我相同的天真的方法的人会发现它有用,但不要选择它作为答案,因为它确实not直接回答原问题。)

Phoenix下AUI的使用示例

该代码示例正是我想要做的MultiSplitterWindow,但由自动管理AuiManager.

import wx, wx.adv
import wx.lib.mixins.inspection as wit
from wx.lib.agw import aui


class AppWInspection(wx.App, wit.InspectionMixin):
    def OnInit(self):
        self.Init()  # enable Inspection tool
        return True


class AuiFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(size=(800, 800), *args, **kwargs)
        self.SetMinSize((600, 600))

        # Create an AUI Manager and tell it to manage this Frame
        self._manager = aui.AuiManager()
        self._manager.SetManagedWindow(self)

        inner_panel1 = wx.Panel(parent=self)
        inner_panel1.SetBackgroundColour('#999980')
        inner_panel1.SetMinSize((100, 100))
        inner_panel1_info = aui.AuiPaneInfo().Name('inner_panel1').Caption('Inner Panel 1').Left().\
            CloseButton(True).MaximizeButton(True).MinimizeButton(True).Show().Floatable(True)

        inner_panel2 = wx.Panel(parent=self)
        inner_panel2.SetBackgroundColour('#999990')
        inner_panel2_info = aui.AuiPaneInfo().Name('inner_panel2').Caption('Inner Panel 2').Left().Row(1).\
            Show().Floatable(False)

        inner_panel3 = wx.Panel(parent=self)
        inner_panel3.SetBackgroundColour('#9999A0')
        inner_panel3.SetMinSize((100, 100))
        inner_panel3_info = aui.AuiPaneInfo().Name('inner_panel3').Caption('Inner Panel 3').CenterPane()

        self._manager.AddPane(inner_panel1, inner_panel1_info)
        self._manager.AddPane(inner_panel2, inner_panel2_info)
        self._manager.AddPane(inner_panel3, inner_panel3_info)
        self._manager.Update()

    def __OnQuit(self, event):
        self.manager.UnInit()
        del self.manager
        self.Destroy()

if __name__ == '__main__':
    app = AppWInspection(0)
    frame = AuiFrame(parent=None, title='AUI Manager Test')
    app.SetTopWindow(frame)
    frame.Show()
    app.MainLoop()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

约束 wxPython MultiSplitterWindow 窗格 的相关文章

随机推荐

  • java中传递接口引用和类引用的区别

    传递接口引用或类引用之间有什么区别 如示例所示 Interface MyInterface void foo public class MyClass implements MyInterface public void foo doJob
  • 在 RESTful 服务中表示“即发即忘”操作的 HTTP 方法

    考虑到 REST 将 HTTP 方法映射到 CRUD 操作相对容易 POST 用于创建 GET 用于读取等 但是 即发即忘 操作又如何呢 哪种 HTTP 方法最能代表 即发即忘 操作 例如触发批处理作业 其中不会向调用方发送任何响应 我会想
  • 如何配置 FlatFileItemWriter 将文件输出到 ByteArrayRecource?

    我遇到的情况是部署服务器不允许应用程序将文件输出到其文件系统 所以我要做的是配置FlatFileItemWriter 将结果文件输出到静态Resource属性 多线程在这里不是问题 我当前的代码是 flatFileItemWriter se
  • Azure Functions 应用程序见解中的自定义属性

    我正在 Azure Application Insights 中监视大量应用程序 在所有这些中 我向事件 跟踪等添加了一些自定义属性 以便我可以在门户中进行过滤 分组 是否可以将相同的自定义属性添加到与 Azure Functions 的内
  • 几秒钟后画布性能下降

    我编写了以下 1000 个边界方块演示来测试 HTML5 画布的功能 一开始运行良好 但几秒钟后 fps 明显下降 我不知道为什么 任何指示将不胜感激 var c document getElementById canvas var con
  • 通过Powershell十六进制编辑二进制文件的方法

    我正在尝试仅使用 PowerShell 从命令行执行二进制十六进制编辑 我已经部分成功地用这个片段执行了十六进制替换 我的问题出现时123456发生多次 因为替换只应该在特定位置进行 Note 该片段需要Convert ByteArrayT
  • 将 Bokeh 更新为 0.5.0,现在可以在一个窗口中绘制所有以前版本的图表

    在更新之前 我会运行脚本并输出 html 文件 窗户上将有我的一处地块 我会对我的脚本进行更改 运行它 输出 html 文件 查看新的绘图 然后我再次安装该库以使用 conda 更新它 我对脚本做了一些更改 再次运行它 输出文件包括我进行一
  • 一张背景图片适用于多个 div

    我想使用 1 个背景图像 1366x768 在多个 div 中使用 但如果我使用 my divs background image url image jpg 我只有每个 div 上图像的左上角 我想使用基于 div 位置的图像部分 我可以
  • 如何使用Slick2.0.1映射postgresql自定义枚举列?

    我就是想不通 我现在使用的是 abstract class DBEnumString extends Enumeration implicit val enumMapper MappedJdbcType base Value String
  • Maven - java.net.BindException:地址已在使用中

    我正在尝试在 Ubuntu 12 04 中运行以下命令 mvn jetty run 并收到以下错误 2013 09 04 13 21 32 843 WARN failed email protected cdn cgi l email pr
  • 基于另一个 Observable 的自定义过滤器的函数反应运算符

    为了好玩和学习 我尝试使用函数反应式编程在我的应用程序中实现撤消系统 我有一个状态更改流 需要将其保存到撤消堆栈中 当用户单击撤消时 我从堆栈中获取一个值并相应地更新应用程序状态 问题是此更新本身也会在状态更改流中生成一个事件 所以我想要的
  • 目前不存在哪些有用的 R 包? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • AVAudioPlayer:音量按钮在某些设备上有效,在其他设备上无效

    我有一个应用程序使用AVAudioPlayer播放一些嵌入的 MP3 文件 音量按钮在我主要用于测试的 3GS 上工作可靠 它们在 4 1 下工作 升级到 4 3 1 后现在可以工作 在我老板运行 4 2 1 的 iPhone 4 上 它们
  • 创建 XML 站点地图生成器 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想创建一个 XML 站点地图生成器 我有一个脚本 如果与其他文件一起放置在您的目录中 它会创建一个站点地图 但我想创建一个可以使用
  • 为r中的每个变量按组汇总表中的数据

    我有一些数据 我想用 R 中的一些汇总值正确格式化 我已经玩过aggregate和其他事情 例如summaryBy 但没有一个产生我想要的结果 这是数据 data lt data frame id c 1 2 3 4 5 6 7 8 9 1
  • android 无法从服务器加载图像

    在这里 我尝试从服务器下载图像 但它总是抛出异常 任何人都可以告诉我为什么会发生这种情况以及正确的方法是什么 public static String getBitmap String url throws IOException Inpu
  • 多个键名,相同的对值

    我正在尝试在 JavaScript 脚本中设置一个对象文字 该脚本具有具有多个名称的键 引用相同的对象值 即我已经尝试过的类似内容 var holidays thanksgiving day thanksgiving t day someV
  • 包装对象返回值(例如 Integer)是否会导致 Java 中的自动装箱?

    对于这个看似简单的问题 我找不到明确的答案 如果我写一个这样的方法 public Integer getAnInt int i 4 return i 0 返回值是否自动装箱为 Integer 还是取决于返回值后发生的情况 例如 分配给它的变
  • Python:UnboundLocalError:赋值之前引用的局部变量[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我在Pyt
  • 约束 wxPython MultiSplitterWindow 窗格

    Edit 我将问题保留原样 因为这仍然是一个好问题 而且答案可能对其他人有用 但是 我会注意到我找到了一个实际的解决方案my通过使用完全不同的方法来解决问题AuiManager 看到answer https stackoverflow co