【问题标题】:wxPython using a sizer with panelswxPython 使用带有面板的 sizer
【发布时间】:2020-03-10 23:11:30
【问题描述】:

我正在尝试在左侧制作一个带有相机输入的 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()

当我运行这段代码时,我得到的只是一个小窗口,只有一个名为“TEST”的按钮(应该在右侧的面板)。只有相机面板的先前版本工作正常,所以这不是问题。我做错了什么?

更新: 子面板的尺寸是固定的,我看到带有摄像头的面板出现了,但屏幕上只有一条小线。带按钮的部分显示完美。

【问题讨论】:

    标签: python user-interface wxpython wxwidgets


    【解决方案1】:

    首先,您没有给HUDPanel 指定任何大小,所以我不确定您希望它如何显示。

    其次,您一直在递归调用 update(每隔 15 毫秒),这绝对是个坏主意,因为这将消耗接近 100% 的(一个)CPU,并且可能会阻止您的应用程序调度其他事件。

    【讨论】:

    • 我已将self.SetSize((640,480)) 添加到HUDPanel 并添加到ExtraPanel(以确保它们具有相同的大小)。我在主框架上添加了两倍宽的尺寸,以确保两个面板都有足够的空间显示,但只有带有按钮的面板显示。
    • 你应该创建它的大小或调用SetInitialSize(),如果你想让它不缩小,稍后调用SetSize()不会阻止窗口变小(否则它的大小永远不会减小!)。
    • 添加 self.SetInitialSize() 效果很好,感谢您的帮助!
    猜你喜欢
    • 2012-12-10
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多