这里有一个关于将Vispy的SceneCanvas嵌入到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()如果可能有用,我的配置是:
发布于 2018-07-19 09:11:46
在触发事件wx.EVT_SIZE时,我手动将画布大小调整到面板大小,从而解决了这个问题。例如,在您的my_panel_1定义中:
def adapt_canvas_size(self):
w, h = self.GetSize()
self.canvas.size = (w,h)您还可以通过一个wx.CallAfter()来调用它
但是,我也在vispy库中发现了一个bug,我解决了覆盖相关函数的问题:
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_fixedbug将一对元素传递给self.SetSize(w,h),而不是一个具有所需维数self.SetSize(w,h)的数组。
希望这能帮上忙,向你问好,弗朗西斯科
https://stackoverflow.com/questions/48724800
复制相似问题