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]).
Надеюсь, это поможет, с наилучшими пожеланиями, Франческо