在wx(python)中强制面板为方形

在wx(python)中强制面板为方形,python,wxpython,panel,wxwidgets,Python,Wxpython,Panel,Wxwidgets,有人知道我会怎么强迫一块板成正方形吗 出现这种情况的情况是有一个面板,其中我有一个带2个插槽的水平BoxSizer,在左侧插槽中我有一个面板,我将通过wx.PaintDC绘制到该面板,在右侧我将有一个列表控件或其他一些小部件 我试图实现的是使窗口可实现,使左侧面板始终保持方形,并使右侧内容填充其余空间。您可以绑定到wx.EVT\u SIZE以在调整窗口大小时调整面板大小。部分代码(未经测试,但类似于此): 解决方案之一是在事件函数中使用EVT_SIZE来响应窗口大小调整和更新面板大小。简单示例代

有人知道我会怎么强迫一块板成正方形吗

出现这种情况的情况是有一个面板,其中我有一个带2个插槽的水平BoxSizer,在左侧插槽中我有一个面板,我将通过wx.PaintDC绘制到该面板,在右侧我将有一个列表控件或其他一些小部件


我试图实现的是使窗口可实现,使左侧面板始终保持方形,并使右侧内容填充其余空间。

您可以绑定到
wx.EVT\u SIZE
以在调整窗口大小时调整面板大小。部分代码(未经测试,但类似于此):


解决方案之一是在事件函数中使用EVT_SIZE来响应窗口大小调整和更新面板大小。简单示例代码:

import wx
from wx.lib.mixins.inspection import InspectionMixin

class MyApp(wx.App, InspectionMixin):
    def OnInit(self):
        self.Init()  # initialize the inspection tool
        frame = wx.Frame(None)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        frame.SetSizer(sizer)

        self.__squarePanel = wx.Panel(frame)
        sizer.Add(self.__squarePanel, 0, wx.ALL | wx.EXPAND, 5)

        frame.Bind(wx.EVT_SIZE, self.OnSize)

        frame.Show()
        self.SetTopWindow(frame)
        return True  

    def OnSize(self, evt):
        frame = evt.GetEventObject()
        frameW, frameH = frame.GetSize()
        targetSide = min(frameW, frameH)
        self.__squarePanel.SetSize((targetSide, targetSide))


app = MyApp()
app.MainLoop()

这是一个非常好的答案,在大多数情况下都有效,除了右边的窗格没有自动调整大小,左边的窗格在元素下滑动,我将在同一事件中尝试调整右边面板的大小,你有其他建议吗?我已决定走另一条路,由于你提供了一个很好的出发点,我正在为你的答案打分
import wx
from wx.lib.mixins.inspection import InspectionMixin

class MyApp(wx.App, InspectionMixin):
    def OnInit(self):
        self.Init()  # initialize the inspection tool
        frame = wx.Frame(None)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        frame.SetSizer(sizer)

        self.__squarePanel = wx.Panel(frame)
        sizer.Add(self.__squarePanel, 0, wx.ALL | wx.EXPAND, 5)

        frame.Bind(wx.EVT_SIZE, self.OnSize)

        frame.Show()
        self.SetTopWindow(frame)
        return True  

    def OnSize(self, evt):
        frame = evt.GetEventObject()
        frameW, frameH = frame.GetSize()
        targetSide = min(frameW, frameH)
        self.__squarePanel.SetSize((targetSide, targetSide))


app = MyApp()
app.MainLoop()