wxPython 使用带有面板的 sizer
wxPython using a sizer with panels
我正在尝试制作一个 GUI,左侧是一个摄像头输入,其中包含摄像头流中的一些数据。在右侧,我想要一些按钮和其他小部件。到目前为止的代码:(函数 get_image()
和 pil_to_wx()
工作正常,只是没有在下面的代码中显示)
class HUDPanel(wx.Panel):
def __init__(self, parent):
super(HUDPanel, self).__init__(parent, -1)
self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
self.Bind(wx.EVT_PAINT, self.on_paint)
self.update()
def update(self):
self.Refresh()
self.Update()
wx.CallLater(15, self.update)
def create_bitmap(self):
image = get_image()
bitmap = pil_to_wx(image)
return bitmap
def on_paint(self, event):
bitmap = self.create_bitmap()
dc = wx.AutoBufferedPaintDC(self)
dc.DrawBitmap(bitmap, 0, 0)
class ExtraPanel(wx.Panel):
def __init__(self, parent):
super(ExtraPanel, self).__init__(parent, -1)
My_Button = wx.Button(self,label="TEST")
class Frame(wx.Frame):
def __init__(self):
style = wx.DEFAULT_FRAME_STYLE & ~wx.RESIZE_BORDER & ~wx.MAXIMIZE_BOX
super(Frame, self).__init__(None, -1, 'Camera Viewer', style=style)
my_sizer = wx.BoxSizer(wx.HORIZONTAL)
campanel = HUDPanel(self)
my_sizer.Add(campanel, 0, wx.ALL | wx.CENTER, 5)
widgetpanel = ExtraPanel(self)
my_sizer.Add(widgetpanel, 0, wx.ALL | wx.CENTER, 5)
self.SetSizer(my_sizer)
self.Fit()
def main():
app = wx.App()
frame = Frame()
frame.Show()
app.MainLoop()
if __name__ == '__main__':
main()
当我 运行 这段代码时,我得到的只是一个很小的 window,只有一个名为 "TEST" 的按钮(应该在右侧的面板)。以前只有摄像头面板的版本工作正常,所以这不是问题。我做错了什么?
更新:
子面板的大小是固定的,我看到带有摄像头的面板出现了,但屏幕上只有一条小线。按钮部分显示完美
首先,你没有给你的 HUDPanel
任何尺寸,所以我不确定你希望它如何出现。
其次,您一直在递归调用 update
(每 15 毫秒一次),这绝对是一个坏主意,因为这将消耗近 100% 的(一)CPU并且可能会阻止您的应用程序调度其他事件。
我正在尝试制作一个 GUI,左侧是一个摄像头输入,其中包含摄像头流中的一些数据。在右侧,我想要一些按钮和其他小部件。到目前为止的代码:(函数 get_image()
和 pil_to_wx()
工作正常,只是没有在下面的代码中显示)
class HUDPanel(wx.Panel):
def __init__(self, parent):
super(HUDPanel, self).__init__(parent, -1)
self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
self.Bind(wx.EVT_PAINT, self.on_paint)
self.update()
def update(self):
self.Refresh()
self.Update()
wx.CallLater(15, self.update)
def create_bitmap(self):
image = get_image()
bitmap = pil_to_wx(image)
return bitmap
def on_paint(self, event):
bitmap = self.create_bitmap()
dc = wx.AutoBufferedPaintDC(self)
dc.DrawBitmap(bitmap, 0, 0)
class ExtraPanel(wx.Panel):
def __init__(self, parent):
super(ExtraPanel, self).__init__(parent, -1)
My_Button = wx.Button(self,label="TEST")
class Frame(wx.Frame):
def __init__(self):
style = wx.DEFAULT_FRAME_STYLE & ~wx.RESIZE_BORDER & ~wx.MAXIMIZE_BOX
super(Frame, self).__init__(None, -1, 'Camera Viewer', style=style)
my_sizer = wx.BoxSizer(wx.HORIZONTAL)
campanel = HUDPanel(self)
my_sizer.Add(campanel, 0, wx.ALL | wx.CENTER, 5)
widgetpanel = ExtraPanel(self)
my_sizer.Add(widgetpanel, 0, wx.ALL | wx.CENTER, 5)
self.SetSizer(my_sizer)
self.Fit()
def main():
app = wx.App()
frame = Frame()
frame.Show()
app.MainLoop()
if __name__ == '__main__':
main()
当我 运行 这段代码时,我得到的只是一个很小的 window,只有一个名为 "TEST" 的按钮(应该在右侧的面板)。以前只有摄像头面板的版本工作正常,所以这不是问题。我做错了什么?
更新: 子面板的大小是固定的,我看到带有摄像头的面板出现了,但屏幕上只有一条小线。按钮部分显示完美
首先,你没有给你的 HUDPanel
任何尺寸,所以我不确定你希望它如何出现。
其次,您一直在递归调用 update
(每 15 毫秒一次),这绝对是一个坏主意,因为这将消耗近 100% 的(一)CPU并且可能会阻止您的应用程序调度其他事件。