【问题标题】:WxPython and VispyWxPython 和 Vispy
【发布时间】:2018-02-10 19:35:37
【问题描述】:

这里有一个关于在 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
  • Vispy 0.6.0

【问题讨论】:

    标签: python vispy wxpython


    【解决方案1】:

    我通过在触发事件 wx.EVT_SIZE 时手动调整画布大小以适应面板大小解决了这个问题。例如,在您的 my_panel_1 中定义:

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

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

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

    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]) 的单个数组。

    希望这会有所帮助,最好的问候, 弗朗切斯科

    【讨论】:

      猜你喜欢
      • 2021-04-30
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多