首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WxPython与Vispy

WxPython与Vispy
EN

Stack Overflow用户
提问于 2018-02-10 19:35:37
回答 1查看 564关注 0票数 1

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

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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2018-07-19 09:11:46

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

代码语言:javascript
复制
def adapt_canvas_size(self):
    w, h = self.GetSize()
    self.canvas.size = (w,h)

您还可以通过一个wx.CallAfter()来调用它

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

代码语言:javascript
复制
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

bug将一对元素传递给self.SetSize(w,h),而不是一个具有所需维数self.SetSize(w,h)的数组。

希望这能帮上忙,向你问好,弗朗西斯科

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48724800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档