wxPython / Python3:使用 wx.ScreenDC().GetPPI() 设置面板大小 - 抛出错误

问题描述

我有一个又长又复杂的程序(很抱歉,我无法将其精简为一个独立的最小可重现脚本,但我会尽可能包含片段)并且经过一些数据分析后,得到了一个相当复杂的“结果” " 框架出现。该框架包含一个笔记本,每个笔记本的页面都包含另一个笔记本,其页面只是带有 sizer 的面板,其中包含一个 matplotlib 画布,在该画布上绘制了图形/绘图。

无论如何,在调整此结果框的大小时,子笔记本中的“绘图”面板会展开,从而弄乱绘图的纵横比(画布设置为展开;在用于情节笔记本的页面,我添加了画布

PlotPanel(wx.Panel)

我试图解决这个问题,当将包含 self.mainsizer.Add(self.canvas,wx.SizerFlags().Expand())` self.SetSizerAndFit(self.mainsizer) 页的笔记本添加到包含它的 PlotPanel 时,添加标志 ResultPanel

wx.SHAPED

但我读到要使其正常工作,您需要在 self.plotsizer.Add(self.plotnotebook,1,wx.EXPAND|wx.SHAPED) 方法中为笔记本用作页面的 Panel 类指定大小。

所以我尝试将类声明为

__init__()

然后将我的 class PlotPanel(wx.Panel): def __init__(self,parent,df,lod): wx.Panel.__init__(self,parent=parent,id=wx.ID_ANY,size=npnlsz) ......... 函数写为

main()

试图能够在 def main(): app = wx.App() w,h = wx.ScreenDC().GetPPI() global pnlsz pnlsz = wx.Size(w*5,h*5) frm = StartFrame(None) frm.Show() app.MainLoop() 类的 PlotPanel 中访问此大小。但是,无论我在哪里粘贴 __init__ 变量,我都会收到错误

global pnlsz

即使(如上所示)wx.App 对象是在其他任何事情之前创建的!

注意:我使用 Traceback (most recent call last): File "<stdin>",line 1,in <module> File "<string>",line 476,line 477,in PlotPanel wx._core.PyNoAppError: The wx.App object must be created first! 是因为该程序将在许多具有不同显示器和 DPI 设置的不同机器上运行,并且我希望对象显示为 4" x 4",而不管显示器如何。

不过,主要问题是保持画布的纵横比——如果必须的话,我可以只对尺​​寸进行硬编码,但我仍然需要一种方法来保持图形的纵横比 (1:1)调整框架大小时的画布。因此,欢迎使用任何其他方法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)