1

这里有一个关于在 WxPython 应用程序中嵌入 Vispy 的 SceneCanvas 的问题。如何调整 SceneCanvas 的大小以适合面板?并在调整窗口大小时再次调整大小?

你可以试试这段代码。如果最大化窗口,您会看到蓝色背景。OpenGL 画布的大小不会改变。

import wx
import vispy.scene as scene


class Canvas(scene.SceneCanvas):
    def __init__(self, *a, **k):
        scene.SceneCanvas.__init__(self, *a, **k)
        view = self.central_widget.add_view()
        view.bgcolor = '#ef00ef'
        self.show()


class my_panel_1(wx.Panel):
    def __init__(self, *a, **k):
        wx.Panel.__init__(self, *a, **k)
        self.SetBackgroundColour(wx.BLUE)
        self.canvas = Canvas(app="wx", parent=self)


class my_panel_2(wx.Panel):
    def __init__(self, *a, **k):
        wx.Panel.__init__(self, *a, **k)
        self.SetBackgroundColour(wx.GREEN)
        a_text = wx.TextCtrl(self, pos=(10, 10))
        a_button = wx.Button(self, -1, 'Hello Word', pos=(10, 50))


class MyFrame(wx.Frame):
    def __init__(self, *a, **k):
        wx.Frame.__init__(self, *a, **k, title="Title", size=(800, 600))

        box = wx.BoxSizer(wx.HORIZONTAL)

        panel1 = my_panel_1(self)
        box.Add(panel1, 1, wx.EXPAND)

        box2 = wx.BoxSizer(wx.VERTICAL)
        box.Add(box2, 0, wx.EXPAND)

        panel2 = my_panel_2(self)
        box2.Add(panel2, 1, wx.EXPAND)

        self.SetAutoLayout(True)
        self.SetSizer(box)
        self.Layout()


if __name__ == '__main__':
    app = wx.App(False)
    frame = MyFrame(None)
    frame.Show(True)
    app.MainLoop()

如果有用,我的配置是:

  • Linux 丽贝卡
  • Python 3.6.4
  • WxPython 4.0.1
  • 维斯比 0.6.0
4

1 回答 1

1

我通过在触发事件 wx.EVT_SIZE 时手动将画布大小调整为面板大小来解决此问题。例如,在您的 my_panel_1 中定义:

def adapt_canvas_size(self):
    w, h = self.GetSize()
    self.canvas.size = (w,h)

您可能还想通过 wx.CallAfter() 调用它

但是,我还在 vispy lib 中发现了一个错误,我解决了覆盖相关函数的问题:

import vispy.app.backends._wx as wx_backend

def _vispy_set_size_fixed(self, w, h):
    # Set size of the widget or window
    if not self._init:
        self._size_init = (w, h)
    if hasattr(self, 'SetSize'):
        # phoenix
        self.SetSize([w, h]) # bugfix: pass an array as single argument to the SetSize, not two values as two arguments!
    else:
        # legacy
        self.SetSizeWH(w, h)

# override the related library function which appear to be bugged  
wx_backend.CanvasBackend._vispy_set_size = _vispy_set_size_fixed

该错误是将几个元素传递给 self.SetSize(w, h) 而不是具有所需维度 self.SetSize([w, h]) 的单个数组。

希望这会有所帮助,最好的问候, Francesco

于 2018-07-19T09:11:46.313 回答