微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

与wxpython cairo混淆; wx.BufferedPaintDC使笔划消失

如何解决与wxpython cairo混淆; wx.BufferedPaintDC使笔划消失

我对wxpython和cairo比较陌生,请原谅任何错误

在使用wxpython&cairo绘制矩形时,有时会显示边框(描边),有时并不取决于ctx.set_line_width()的值。当它不显示时,我在python控制台中收到以下消息(使用pycharm): _cairo_win32_display_surface_flush:操作成功完成。

控制台消息似乎是由.stroke()命令生成的。

如果我不检查双缓冲,而使用dc = wx.PaintDC(self),则边框将如您所愿。但是,在复杂的图形上,这会不会引起滑动问题?

问题:

  • 在复杂的图形上,使用wx.PaintDC()是正确的方法吗?
  • 有没有一种使用wx.BufferedPaintDC()的方式,并按预期显示了这些行?
  • 控制台消息是什么意思? (“ _cairo_win32_display_surface_flush:操作成功完成”)

对此我感到很困惑,因此我们将不胜感激。

在Windows上使用Python 3.8,wxpython 4.1和cairo(cairocffi)进行编码。

我的绘画事件代码是:

    def on_paint(self,event):

        if self.IsDoubleBuffered():
            dc = wx.PaintDC(self)
        else:
            dc = wx.BufferedPaintDC(self)

        dc.SetBackground(wx.WHITE_Brush)
        dc.Clear()

        w,h = self.GetClientSize()
        ctx = wxcairo.ContextFromDC(dc)

        # draw stuff
        ctx.set_source_rgb(0.65,0.65,0.65)
        ctx.rectangle(25,25,w-50,h-50)
        ctx.fill_preserve()
        ctx.set_source_rgb(0.1,0.1,0.1)
        ctx.set_line_width(1)  # width of 10 works,width of 1 doesn't
        ctx.stroke()

简化的演示代码

import wx
import wx.lib.wxcairo as wxcairo


class MyPanel(wx.Panel):
    def __init__(self,parent,*args,**kwargs):
        super(MyPanel,self).__init__(parent,**kwargs)

        self.Bind(wx.EVT_SIZE,self.on_resize)
        self.Bind(wx.EVT_PAINT,self.on_paint)
        self.Bind(wx.EVT_ERASE_BACKGROUND,self.on_erase_bkground)

    def on_erase_bkground(self,event):
        pass

    def on_resize(self,event):
        self.Refresh()
        self.Layout()

    def on_paint(self,event):

        if self.IsDoubleBuffered():  # returns false
            dc = wx.PaintDC(self)
        else:
            dc = wx.BufferedPaintDC(self)

        # dc = wx.PaintDC(self)  # works as anticipated with thin line widths
        dc.SetBackground(wx.WHITE_Brush)
        dc.Clear()

        w,width of 1 doesn't
        ctx.stroke()  # console message generated by this line

class MyFrame(wx.Frame):
    def __init__(self,title):
        super(MyFrame,self).__init__(None,title=title,size=(600,400))

        # simple layout
        panel = MyPanel(self)
        sizer = wx.BoxSizer()
        sizer.Add(panel,1,wx.EXPAND)
        self.SetSizer(sizer)

        # display
        self.Center()
        self.Show()


if __name__ == '__main__':
    app = wx.App()
    frame = MyFrame(None,'WXPython demo')
    app.MainLoop()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。