如何解决与wxpython cairo混淆; wx.BufferedPaintDC使笔划消失
我对wxpython和cairo比较陌生,请原谅任何错误。
在使用wxpython&cairo绘制矩形时,有时会显示边框(描边),有时并不取决于ctx.set_line_width()
的值。当它不显示时,我在python控制台中收到以下消息(使用pycharm):
_cairo_win32_display_surface_flush:操作成功完成。
如果我不检查双缓冲,而使用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 举报,一经查实,本站将立刻删除。