Как (правильно) синхронизировать self.Refresh () с обновлением экрана, чтобы избежать мерцания рисунка? - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь оживить 2-й объект (нарисованный как путь), поэтому его необходимо перерисовать.Каков наилучший способ перерисовать его без мигающего объекта?

После перерисовки с помощью self.Refresh() при вызове onIdle-Event я использовал таймер с фиксированным временем для вызова self.Refresh(),который работает лучше.Но все же у меня проблема с мигающим объектом.

import wx
import math
import time

class ObjectDrawer(wx.Frame):

    def __init__(self, *args, **kw):
        # Initialize vars
        self.dc = None
        self.gc = None
        self.lastTime = time.time()
        super(ObjectDrawer, self).__init__(*args, **kw)
        self.InitUI()

    def InitUI(self):
        self.timer = wx.Timer(self)
        # Initialize the GUI
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.Bind(wx.EVT_TIMER, self.evt_timer)
        self.ShowFullScreen(True)
        self.SetBackgroundColour('white')

    def evt_timer(self, event):
        self.Refresh()

    def drawObjects(self):
        path = self.gc.CreatePath()
        #Add Something to the path e.g. a circle
        path.AddCircle(100,100,50)
        self.gc.StrokePath(path)
        path = None

    def OnPaint(self, e):
        dc = wx.PaintDC(self)
        self.gc = wx.GraphicsContext.Create(dc)
        self.gc.SetPen(wx.Pen('#e8b100', 5, wx.LONG_DASH))
        self.drawObjects()
        self.timer.Start(1000/60)


app = wx.App()
window = ObjectDrawer(None)
window.Show()
app.MainLoop()

1 Ответ

0 голосов
/ 04 апреля 2019

Если вы установите self.Refresh() на self.Refresh(False), мерцание исчезнет.Вы также можете использовать wx.AutoBufferedPaintDC вместо wx.PaintDC.Взгляните на этот пример в wxpython wiki для более сложного примера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...