如何在具有大边框的wx.Panel派生类中重新定位子项?

时间:2016-01-06 03:37:09

标签: wxpython

我有一个派生自wx.Panel的类,它在大的边框区域中创建一个图像(例如,在左边缘上有超过30个像素)。我希望能够从我的应用程序的部分面板中为它派生子类,但我无法弄清楚如何调整派生面板中子项的位置 - 他们认为增加的边框区域是客户端窗口,非常高兴地将自己置于其下(并随后被基类' EVT_PAINT处理程序擦除)。

我已经尝试跟踪客户区并覆盖我的基类中的各种GetClient ...方法,但它似乎没有改变有关子行为的任何内容。我想我可以手动重新定位子类中的子窗口,但这是很多重复的代码,看起来它不应该是必要的。

在互联网上搜索答案并不是一个成功的企业。我也尝试通过wx代码查找答案,但我也没有运气。

在窗口中定义客户区的最佳方法是什么,以便孩子自动将自己定位在远离父母边缘的位置?有没有办法告诉新对象他们的父母的客户区域不是从(0,0)开始(看起来像重写GetClientAreaOrigin应该这样做,但似乎没有工作)?我应该在Layout()或wx.EVT_SIZE处理程序的上下文中手动移动它们吗?什么是优雅和/或适当的解决方案?

1 个答案:

答案 0 :(得分:0)

经过一番努力后,我放弃了这种方法,但我确实取得了一些有限的成功,我想指出我学到的一些东西,以防其他人考虑它。

  1. 看看PyPanel - 它的设计被广泛覆盖,并且对我正在做的大部分事情做出了很好的反应。

  2. 我在最初的努力中找到的最佳方法是创建一个面板实例作为控件的子级,以充当内容管理器。我在控件中重载了AddChild和SetSizer,将它们重定向到子面板;我还实现了一个受保护的标志,我可以在控件中设置它以防止重定向(否则我会在创建它时尝试将内容面板添加到自身而不是控件)。

  3. 我仍然遇到一些奇怪的特定控件(SpinCtrl特别希望以非常奇怪的方式定位自己,通常部分在内容面板之外,尽管我尽力阻止它)。我也有一些麻烦,让sizer在控件的最佳/最小尺寸方面表现良好。

  4. 我认为我能给出的最好的建议是考虑寻找其他方法来做到这一点;在我的情况下,我能够创建一个可以包含在面板中的控件,以促进父级的期望行为;父亲的例程中的钩子比我在原始努力中创建的派生类的弗兰肯斯坦式混乱更容易管理。