0

ボタンをクリックするとループアニメーションになるはずのwxアプリを作成しています。背景色は、ボタン上でアニメーション化されているものです。数分間は正常に動作しますが、数分後にアプリが応答しなくなり、コンピューターがクラッシュすることさえあります。
アニメーションを非常に長時間実行できることは、アプリケーションの使用にとって重要です。タイマーを使用してアニメーションを実行しています。さまざまなフレーム レートとダブル バッファリングを使用して定期的に DC をクリアしようとしましたが、毎回同じ結果が得られます。

私のコードは以下の通りです:

import wx
import os

# begin wxGlade: extracode
# end wxGlade


class LbDisplay(wx.Frame):
    sixon = False
    sevenon = False
    eighton = False
    nineon = False
    tenon = False
    elevenon = False
    ID_TIMER = 1
    Speed = 1
    red = 255
    anim = 'down'

    def __init__(self, *args, **kwds):
        # begin wxGlade: LbDisplay.__init__
        kwds["style"] = wx.NO_BORDER | wx.NO_FULL_REPAINT_ON_RESIZE
        wx.Frame.__init__(self, *args, **kwds)
        self.timer = wx.Timer(self, LbDisplay.ID_TIMER)
        self.button_6 = wx.Button(self, -1, "")
        self.button_7 = wx.Button(self, -1, "")
        self.button_8 = wx.Button(self, -1, "")
        self.button_9 = wx.Button(self, -1, "")
        self.button_10 = wx.Button(self, -1, "")
        self.button_11 = wx.Button(self, -1, "")
        self.button_11.Bind(wx.EVT_BUTTON, self.close)
        self.button_6.Bind(wx.EVT_BUTTON, self.change_six)
        self.Bind(wx.EVT_TIMER, self.blink, id=LbDisplay.ID_TIMER)
        self.Bind(wx.EVT_PAINT, self.OnPaint)

        self.__set_properties()
        self.__do_layout()

        # end wxGlade

    def __set_properties(self):
        # begin wxGlade: LbDisplay.__set_properties
        self.SetTitle("LbDisplay")
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: LbDisplay.__do_layout

        self.SetMinSize(wx.GetDisplaySize())
        grid_sizer_1 = wx.GridSizer(6, 1, 0, 0)
        grid_sizer_1.Add(self.button_6, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.button_7, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.button_8, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.button_9, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.button_10, 0, wx.EXPAND, 0)
        grid_sizer_1.Add(self.button_11, 0, wx.EXPAND, 0)
        self.SetSizer(grid_sizer_1)
        grid_sizer_1.Fit(self)
        self.Layout()
        # end wxGlade
    def change_six(self, e):
        if LbDisplay.sixon == False:
            LbDisplay.sixon = True
            self.timer.Start(LbDisplay.Speed)
        else:
            self.button_6.SetBackgroundColour(wx.Colour(223, 220, 217, 0))
            self.timer.Stop()
            LbDisplay.sixon = False

    def close(self,e):
        os._exit(True)

    def blink(self,e):
        if LbDisplay.anim == 'down':
            LbDisplay.red -= 1
            self.button_6.SetBackgroundColour(wx.Colour(LbDisplay.red,0,0))
            if LbDisplay.red <= 56:
                LbDisplay.anim = 'up'
        if LbDisplay.anim == 'up':
            LbDisplay.red += 1
            self.button_6.SetBackgroundColour(wx.Colour(LbDisplay.red,0,0))
            if LbDisplay.red >= 255:
                LbDisplay.anim = 'down'
    def OnPaint(self, e):
        self.dc = wx.PaintDC(self)




# end of class LbDisplay
if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    LbDisplay = LbDisplay(None, -1, "")
    app.SetTopWindow(LbDisplay)
    LbDisplay.Show()
    app.MainLoop()

何か案は?

4

1 に答える 1

0

私は自分でそれを理解しました。上記のコードを観察すると、タイマーが 300fps のリフレッシュ レートを使用していることに気付くでしょう。GPU が 60 fps をはるかに超えることができるとは思いませんが、これは CPU で直接実行されています。笑!20fpsに下げるとうまくいきました。今では一日中問題なく走ることができます。

于 2013-02-07T19:33:05.917 に答える