WxPython и Vispy

Здесь вопрос о встраивании SceneCanvas Vispy в приложение WxPython. Как изменить размер 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()

Если это может быть полезно, моя конфигурация:

  • Линукс Ребекка
  • Python 3.6.4
  • WxPython 4.0.1
  • Vispy 0.6.0

1 ответ

Я решил эту проблему, вручную адаптировав размер холста к размеру панели, когда происходит событие wx.EVT_SIZE. Например, в вашем my_panel_1 определите:

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

Вы также можете вызвать это через wx.CallAfter()

Тем не менее, я также нашел ошибку в lib 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]).

Надеюсь, это поможет, с наилучшими пожеланиями, Франческо

Другие вопросы по тегам