4

我在 wxpython 中编写了一个程序,它在 windows 中运行良好,但是在 lunix 中测试时,我遇到了一些在 linux 中都发生的显示问题。

这是一个测试应用程序,它演示了在面板中调整 FigureCanvasWxAgg 大小的问题,正如面板本身遵循 resizingevent 但 FigureCanvasWxAgg 不遵循,但这在 Windows 中不是问题。

import wx
import matplotlib.figure as plt
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
import wx.lib.inspection

class Test(wx.Frame):

    def __init__(self):
        super(Test, self).__init__(parent=None, id=-1)
        self.figure = plt.Figure()
        self.panel = wx.Panel(self, 1)
        self.figurepanel = FigureCanvas(self.panel, -1, self.figure)
        self.axes1 = self.figure.add_subplot(111)
        frame_box = wx.BoxSizer(wx.VERTICAL)
        frame_box.AddStretchSpacer(prop=1)
        frame_box.Add(self.panel, flag=wx.EXPAND, proportion=2)
        frame_box.AddStretchSpacer(prop=1)
        main_box = wx.BoxSizer(wx.HORIZONTAL)
        main_box.AddStretchSpacer(prop=1)
        main_box.Add(frame_box, flag=wx.EXPAND, proportion=1)
        main_box.AddStretchSpacer(prop=1)
        self.SetSizer(main_box)
        self.Show()
        self.Layout()

def main():
    app = wx.App()
    Test()
    wx.lib.inspection.InspectionTool().Show()
    app.MainLoop()

if __name__ == '__main__':
    main()

我将非常感谢回答的是:

  • 如何解决在 linux 中调整 FigureCanvasWxAgg 大小的问题
  • 在 Windows 和 Linux 上使用 wxPython 进行 GUI 编程的一般方式有什么不同吗?
4

2 回答 2

2

您发布的代码有几个问题:

  1. 您有可以根据需要扩展的水平和垂直间隔,这会导致中心区域保持相同的形状
  2. self.figurepanel不是任何 sizer 的一部分,这意味着即使它的容器调整大小,它也不会self.panel调整大小。

下面的代码生成一个由绘图填充的窗口,该窗口随窗口调整大小:

import wx
import matplotlib.figure as plt
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
import wx.lib.inspection

class Test(wx.Frame):

    def __init__(self):
        super(Test, self).__init__(parent=None, id=-1)
        self.panel = wx.Panel(self, 1)
        self.panel.SetBackgroundColour('RED')

        self.figure = plt.Figure()
        self.axes1 = self.figure.add_subplot(111)
        self.figurepanel = FigureCanvas(self.panel, -1, self.figure)

        main_box = wx.BoxSizer(wx.HORIZONTAL)
        main_box.Add(self.figurepanel, flag=wx.EXPAND, proportion=1)
        self.panel.SetSizer(main_box)

        frame_box = wx.BoxSizer(wx.VERTICAL)
        frame_box.Add(self.panel, flag=wx.EXPAND, proportion=1)

        self.SetSizer(frame_box)
        self.Show()
        self.Layout()

def main():
    app = wx.App()
    Test()
    wx.lib.inspection.InspectionTool().Show()
    app.MainLoop()

if __name__ == '__main__':
    main()

无需自己手动调整大小,我认为调整大小事件传播没有问题。如果有的话,破损会比您看到的要多得多。

于 2014-10-16T17:27:16.027 回答
-1

我想我解决了这个问题。问题是由 wx.EVT_SIZE 女巫引起的,它在 Windows 中似乎是自动的,但在 Linux 中却不是。因此,要解决 Linux 中的问题,您所要做的就是将 wx.Panel 绑定到 wx.EVT_SIZE,然后定义一个适当的事件处理程序来处理调整大小。对我来说诀窍是:

#code beneath is a part if the __init__ metod
self.panel = wx.Panel(self, -1)
self.figurepanel = FigureCanvas(self.panel, -1, self.figure)
self.panel.Bind(wx.EVT_SIZE, self.on_size)
....
#the eventhandler for the panel. The method resizes the the figurepanel and the figure.
def on_size(self, event):
    pix = self.panel.GetClientSize()
    self.figure.set_size_inches(pix[0]/self.figure.get_dpi(),
                                pix[1]/self.figure.get_dpi())
    x,y = self.panel.GetSize()  
    self.figurepanel.SetSize((x-1, y-1))
    self.figurepanel.SetSize((x, y))
    self.figurepanel.draw()
    event.Skip()
于 2013-04-26T09:33:47.247 回答