与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 (将#修改为@)