FigureCanvasWxAgg在Linux中的面板(或笔记本电脑)中未能正确调整大小

4

我编写了一个使用wxpython编写的程序,在Windows中运行良好,但在Linux中测试时出现了一些显示问题。

这里有一个测试应用程序,演示了FigureCanvasWxAgg在面板中调整大小时出现的问题。可以看到,面板本身会随着调整大小事件而改变大小,但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大小的问题
  • wxPython在Windows和Linux上进行GUI编程的一般方式是否有所区别
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()

您无需手动调整大小,我认为也没有任何问题需要调整大小事件的传播。如果有这样的问题,那么会出现比您看到的更多的故障。


-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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接