笔记本中的自定义wxPython控件在笔记本选项卡上绘制

2024-09-30 02:35:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在wxNotebook中使用自定义控件。当我处理绘制事件时,它会绘制在笔记本选项卡的顶部,而不是放置在选项卡区域中。我怎样才能修复这个控制油漆在适当的区域?你知道吗

如果控件不在笔记本选项卡中,则它将正确绘制。你知道吗

以下是问题的图片:

enter image description here

控件的绘制事件正在覆盖笔记本选项卡。这是wxFormBuilder中的窗体外观:

enter image description here

这是我的自定义控件代码:

class ScopePanel2(wx.Control):
    """A ScopePanel is a custom wxWidget to display oscilloscope-type data."""

    def __init__(self, parent, id_, position, size, style):
        # print("Initializing!")
        super().__init__(parent, id_, position, size, style)

        self.SetBackgroundStyle(wx.BG_STYLE_PAINT)

        # bind events
        self.Bind(wx.EVT_PAINT, self.event_on_paint)

        self.Bind(wx.EVT_ERASE_BACKGROUND, self.event_erase_background)
        self.Bind(wx.EVT_SIZE, self.event_size)
        self.Bind(wx.EVT_UPDATE_UI, self.event_update_ui)

        self.Layout()
        self.Fit()

    def event_on_paint(self, event):
        dc = wx.AutoBufferedPaintDC(self)
        self.paint(dc)
        event.Skip()

    def event_erase_background(self, event):
        event.Skip()

    def event_size(self, event):
        self.Refresh()
        event.Skip()

    def event_update_ui(self, event):
        self.Refresh()
        event.Skip()

    def paint(self, dc):
        dc.SetBackground(wx.Brush(wx.GREEN))
        dc.Clear()
        dc.DrawText("Hello!", 0, 0)

下面是窗口初始化代码(由wxFormBuilder生成)

class MyFrame ( wx.Frame ):

    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 500,300 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )
        self.SetForegroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_WINDOW ) )
        self.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_BTNFACE ) )

        bSizer41 = wx.BoxSizer( wx.VERTICAL )

        self.m_notebook4 = wx.Notebook( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0 )
        self.m_panel1 = wx.Panel( self.m_notebook4, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
        bSizer3 = wx.BoxSizer( wx.VERTICAL )

        self.scope_panel = ScopePanel2(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL)

        bSizer3.Add( self.scope_panel, 1, wx.ALL|wx.EXPAND, 5 )


        self.m_panel1.SetSizer( bSizer3 )
        self.m_panel1.Layout()
        bSizer3.Fit( self.m_panel1 )
        self.m_notebook4.AddPage( self.m_panel1, u"a page", False )
        self.m_panel2 = wx.Panel( self.m_notebook4, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
        bSizer2 = wx.BoxSizer( wx.VERTICAL )

        self.m_staticText1 = wx.StaticText( self.m_panel2, wx.ID_ANY, u"MyLabel", wx.DefaultPosition, wx.DefaultSize, 0 )
        self.m_staticText1.Wrap( -1 )

        bSizer2.Add( self.m_staticText1, 0, wx.ALL, 5 )


        self.m_panel2.SetSizer( bSizer2 )
        self.m_panel2.Layout()
        bSizer2.Fit( self.m_panel2 )
        self.m_notebook4.AddPage( self.m_panel2, u"a page", False )

        bSizer41.Add( self.m_notebook4, 1, wx.EXPAND |wx.ALL, 5 )


        self.SetSizer( bSizer41 )
        self.Layout()

        self.Centre( wx.BOTH )

    def __del__( self ):
        pass

Tags: selfeventidsizedef绘制anydc
1条回答
网友
1楼 · 发布于 2024-09-30 02:35:10

只需通过更改以下行,使ScopePanel2对象成为self.m_panel1的子对象,而不是MyFrame

self.scope_panel = ScopePanel2(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL)

class MyFrame

self.scope_panel = ScopePanel2(self.m_panel1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL)

相关问题 更多 >

    热门问题