我在 GUI [wxpython] 中使用绝对定位卡住了

问题描述

我一直在为我的 GUI 使用绝对定位已经有一段时间了,但我在 GUI 中添加了很多东西,在这一点上,当我更改基本布局时,可能需要几个小时才能重新对齐所有内容。现在我已经知道人们会告诉我我应该对所有东西都使用 sizer,但我不知道这是否适用于我的用例我附上了一张图片 here,它显示了我的基本图试图覆盖我的控件。 This 是控件在背景原理图上未对齐时的样子。每当基本图像发生变化时,我都必须手动调整每个控件的绝对定位,以便它显示在正确的位置。如果有人可以向我解释如何避免这种情况,那将非常有帮助。

解决方法

您的原理图是单个图像文件,还是分解为多个子图像?一种开始方法是将原理图布置为每个组件的一堆较小的图像,计算(或试错法)每个控件和给定图像之间的偏移量,在所有内容都布置好后拉出该图像的位置在 __init__() 的末尾,并使用 wx 的 CallAfter。你可以写一个像

这样的函数
def getloc(self,item):
    return self.item.GetScreenPosition()

并根据需要在图像上使用它(在 __init__() 的末尾,所以一切都在原处——除非您在程序运行时动态设置框架内的项目位置)。然后根据您想要的偏移量添加控件

im1posx,im1posy = self.getloc(img1)
ctrlpos = wx.Point(im1posx+<xoffset>,im1posy+<yoffset>)
ctrl1 = wx.TextControl(<parent>,-1,value="",pos=ctrlpos,size=your_size,style=your_flags)

或类似的东西。

不过,这是一个相当棘手的情况。为什么您的基本图像变化如此之大?如果您使用多个基础图像,为什么不将它们分成不同的类(或类实例)并在每个基础图像的基础上调整控件位置?

如果碰巧你根据原理图制作这个 GUI,根据原理图设置控件,然后在路上更改/更新原理图......我认为可能值得等待原理图在打扰布置控件之前就已经完成了。除非你能以某种更有序的方式布置原理图的组件(在这种情况下,你猜对了,使用 sizers),或者在硬编码控制位置之前等待最终的原理图,wxPython 可能不是此特定应用程序的最佳 GUI 框架。