问题描述
我对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 (将#修改为@)