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

wxPython/Python3:使用wx.ScreenDC().GetPPI()设置面板大小-抛出错误,python,matplotlib,canvas,global-variables,wxpython,Python,Matplotlib,Canvas,Global Variables,Wxpython,我有一个长而复杂的程序(很抱歉,我无法将其精简为一个自包含的最小可复制脚本,但我将在可以的地方包含代码片段),经过一些数据分析后,出现了一个相当复杂的“结果”框架。框架包含一个笔记本,每个笔记本的页面都包含另一个笔记本,笔记本的页面只是带有一个尺寸标注器的面板,该尺寸标注器包含一个matplotlib画布,在该画布上绘制图形/绘图 无论如何,当调整此结果帧的大小时,子笔记本中的“绘图”面板将展开,弄乱了绘图的纵横比(画布设置为展开;在绘图笔记本页面使用的PlotPanel(wx.panel)类中

我有一个长而复杂的程序(很抱歉,我无法将其精简为一个自包含的最小可复制脚本,但我将在可以的地方包含代码片段),经过一些数据分析后,出现了一个相当复杂的“结果”框架。框架包含一个笔记本,每个笔记本的页面都包含另一个笔记本,笔记本的页面只是带有一个尺寸标注器的面板,该尺寸标注器包含一个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)
但我了解到,要使其工作,您需要在
\uuuu init\uuuu()
方法中为笔记本用作页面的Panel类指定一个大小

所以我试着把这个类声明为

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
类的
\uuuu init\uuuu
中访问此大小。但是,无论我将
全局pnlsz
变量粘贴到何处,我都会得到错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 476, in <module>
  File "<string>", line 477, in PlotPanel
wx._core.PyNoAppError: The wx.App object must be created first!
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第476行,在
PlotPanel中第477行的文件“”
wx._core.PyNoAppError:必须首先创建wx.App对象!
即使(如上所示)wx.App对象是在创建其他对象之前创建的

注意:我使用的是
wx.ScreenDC().GetPPI()
,因为这个程序将在许多具有不同显示和DPI设置的不同机器上运行,我希望对象显示为4“x 4”,而不管显示如何

不过,主要的问题是保持画布的纵横比——如果必须的话,我可以硬编码大小,但在调整帧大小时,我仍然需要一种方法来保持图形画布的纵横比(1:1)。因此,任何其他方法都是受欢迎的