wxPython используя wxTimer: мой ящик не двигается - PullRequest
0 голосов
/ 07 октября 2011

Я бы хотел анимировать синюю рамку внутри панели, используя wxTimer. Но ничего не происходит

  • Я установил пользовательский класс панели, в котором я рисую поле
  • Я установил пользовательский фрейм, который объединяет мою пользовательскую панель

Вот мой код:

#!/usr/bin/python
# -*- coding: iso-8859-15 -*-

import wx

WHITE_COLOR = (255,255,255)

class AnimationPanel(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.boxParameters = [10,10,60,60]
        self.SetBackgroundColour(wx.Colour(*WHITE_COLOR))
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        timer = wx.Timer(self)
        timer.Start(100)
        self.Bind(wx.EVT_TIMER, self.OnTimer, timer)

    def OnPaint(self, event):
        dc = wx.PaintDC(self)
        self.paintBox(dc)

    def OnTimer(self, event):
        self.boxParameters[0] += 3
        self.Update()

    def paintBox(self, dc):
        dc.SetBrush(wx.Brush("blue"))
        dc.DrawRectangle(*self.boxParameters)

class MainFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, title="Box with far and back movement", size=(300,200))
        AnimationPanel(self)

if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = MainFrame()
    frame.Show(True)
    app.MainLoop()

Заранее спасибо

1 Ответ

3 голосов
/ 07 октября 2011

Вам не хватает пары вещей. Во-первых, wx.Timer выходит из области видимости, как только вы достигли конца метода init , поэтому он уничтожается, прежде чем он вообще что-то делает. Далее, вы хотите использовать Refresh () вместо Update (), так как Refresh () пометит прямоугольник (или весь экран) как «грязный» и заставит его перекрашиваться. См. Документы для получения дополнительной информации: http://www.wxpython.org/docs/api/wx.Window-class.html

Вот обновленная версия, которая работает на моем компьютере с Windows:

import wx

WHITE_COLOR = (255,255,255)

class AnimationPanel(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.boxParameters = [10,10,60,60]
        self.SetBackgroundColour(wx.Colour(*WHITE_COLOR))
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.timer = wx.Timer(self)            
        self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
        self.timer.Start(100)

    def OnPaint(self, event):
        dc = wx.PaintDC(self)
        self.paintBox(dc)

    def OnTimer(self, event):
        self.boxParameters[0] += 3
        print self.boxParameters
        self.Refresh()

    def paintBox(self, dc):
        dc.SetBrush(wx.Brush("blue"))
        dc.DrawRectangle(*self.boxParameters)

class MainFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, title="Box with far and back movement", size=(300,200))
        AnimationPanel(self)

if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = MainFrame()
    frame.Show(True)
    app.MainLoop()
...