From 368ed061010453ddbb30d2c22a80e5c537125917 Mon Sep 17 00:00:00 2001 From: Almar Klein Date: Thu, 22 May 2025 09:21:47 +0200 Subject: [PATCH 1/2] Warn for inproper use of WxRenderWidget --- rendercanvas/wx.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rendercanvas/wx.py b/rendercanvas/wx.py index f785c51..f178d6f 100644 --- a/rendercanvas/wx.py +++ b/rendercanvas/wx.py @@ -205,6 +205,12 @@ class WxRenderWidget(BaseRenderCanvas, wx.Window): def __init__(self, *args, present_method=None, **kwargs): super().__init__(*args, **kwargs) + # Wx can segfault when trying to use a Window as a toplevel widget. Let's warn. + if self.Parent is None: + logger.warning( + "WxRenderWidget is instantiated without a parent (but it's not meant to be toplevel)." + ) + # Determine present method self._surface_ids = None if not present_method: From c35bd6efbcc77f0d36d1b01322ad7e9128976d63 Mon Sep 17 00:00:00 2001 From: Almar Klein Date: Fri, 23 May 2025 10:52:54 +0200 Subject: [PATCH 2/2] allow parentless wx window, but dont size it on init --- rendercanvas/wx.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/rendercanvas/wx.py b/rendercanvas/wx.py index f178d6f..1411c7f 100644 --- a/rendercanvas/wx.py +++ b/rendercanvas/wx.py @@ -205,12 +205,6 @@ class WxRenderWidget(BaseRenderCanvas, wx.Window): def __init__(self, *args, present_method=None, **kwargs): super().__init__(*args, **kwargs) - # Wx can segfault when trying to use a Window as a toplevel widget. Let's warn. - if self.Parent is None: - logger.warning( - "WxRenderWidget is instantiated without a parent (but it's not meant to be toplevel)." - ) - # Determine present method self._surface_ids = None if not present_method: @@ -361,8 +355,13 @@ def _rc_set_logical_size(self, width, height): parent = self.Parent if isinstance(parent, WxRenderCanvas): parent.SetSize(width, height) - else: + elif parent is not None: self.SetSize(width, height) + else: + # The widget has no parent, likely because its going to inserted in a GUI later. + # This method is likely called from _final_canvas_init and if we call self.SetSize() it will likely error/segfault. + # See https://github.com/pygfx/rendercanvas/issues/91 + pass def _rc_close(self): self._is_closed = True