Я пытаюсь создать окно ScrolledWindow, которое можно рисовать с помощью мыши, и оно тоже работает, но я получаю неприятное мерцание, когда пользователь рисует в окне, пока полосы прокрутки не находятся в "" исходное положение ..
Чтобы воспроизвести, запустите прилагаемую программу, прокрутите немного вниз (или вправо) и немного «нарисуйте», удерживая левую кнопку мыши нажатой. Вы должны увидеть мерцание время от времени ..
import wx
class MainFrame(wx.Frame):
""" Just a frame with a DrawPane """
def __init__(self, *args, **kw):
wx.Frame.__init__(self, *args, **kw)
s = wx.BoxSizer(wx.VERTICAL)
s.Add(DrawPane(self), 1, wx.EXPAND)
self.SetSizer(s)
########################################################################
class DrawPane(wx.PyScrolledWindow):
""" A PyScrolledWindow with a 1000x1000 drawable area """
VSIZE = (1000, 1000)
def __init__(self, *args, **kw):
wx.PyScrolledWindow.__init__(self, *args, **kw)
self.SetScrollbars(10, 10, 100, 100)
self.prepare_buffer()
self.Bind(wx.EVT_PAINT, self.on_paint)
self.Bind(wx.EVT_LEFT_DOWN, self.on_mouse_down)
self.Bind(wx.EVT_MOTION, self.on_motion)
def prepare_buffer(self):
self.buffer = wx.EmptyBitmap(*DrawPane.VSIZE)
dc = wx.BufferedDC(None, self.buffer)
dc.Clear()
dc.DrawLine(0, 0, 999, 999) # Draw something to better show the flicker problem
def on_paint(self, evt):
dc = wx.BufferedPaintDC(self, self.buffer, wx.BUFFER_VIRTUAL_AREA)
def on_mouse_down(self, evt):
self.mouse_pos = self.CalcUnscrolledPosition(evt.GetPosition()).Get()
def on_motion(self, evt):
if evt.Dragging() and evt.LeftIsDown():
dc = wx.BufferedDC(wx.ClientDC(self), self.buffer)
newpos = self.CalcUnscrolledPosition(evt.GetPosition()).Get()
coords = self.mouse_pos + newpos
dc.DrawLine(*coords)
self.mouse_pos = newpos
self.Refresh()
if __name__ == "__main__":
app = wx.PySimpleApp()
wx.InitAllImageHandlers()
MainFrame(None).Show()
app.MainLoop()
Я пытался использовать SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
, или привязку EVT_ERASE_BACKGROUND
, или использовать RefreshRect
вместо Refresh
, но мерцание все еще там ... Есть идеи, что я мог бы попробовать дальше?
Моя среда: Xubuntu 9.04, wxPython 2.8.9.1
(но проверено и на Ubuntu 10.04)
Большое спасибо за ваше время!