前提・実現したいこと
wx.pythonで背景が動画のように動いているGUIを作成しようとしています。
dendenmushi様の質問を参考に見様見真似でgifを使ったコードを書いてみたのですが、うまくBitmapの受け渡しができていないようです。
コードの内容についてもどのように動いているのか理解できていない箇所があるため、どなたかわかりやすく教えて頂けないでしょうか。
発生している問題・エラーメッセージ
TypeError: SetBitmap() missing 1 required positional argument: 'bmp'
該当のソースコード
import wx import wx.adv def callLaterTimedGen(gen, done=None, stop=None): #ここがどのような動きをしているか不明 def next_gen(): interval = next(gen, stop) #next関数でdelayを取出しintervalに格納?、stopがdelay? if interval is not stop: wx.CallLater(interval, next_gen) #interval後にnext_gen呼び出し wx.CallAfter(next_gen) #何かの処理の後にnext_gen呼び出し? return gen #genを返す class menuFrame(wx.Frame): def __init__(self): super().__init__(None, wx.ID_ANY, 'メニュー') self.sizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(self.sizer) self.set_screen(MenuPanel) self.sizer.Layout() def set_screen(self,panel): self.now_panel=panel(self) self.sizer.Add(self.now_panel,1,wx.EXPAND) self.sizer.Layout() class MenuPanel(wx.Panel): def __init__(self, parent): super().__init__(parent, wx.ID_ANY ) self.parent=parent self.parent.SetSize(700, 400) self.bmp = None #self.bmpを定義 self.Bind(wx.EVT_TIMER, lambda _:self.Refresh()) #おそらく背景を再描写していると思われるがlambda _:でなぜ背景を指定できるのか不明 self.Bind(wx.EVT_PAINT, self.on_paint) self.timer = wx.Timer(self) #タイマーを搭載 self.timer.Start(100) #タイマーをセット self.btn1 = wx.Button(self, wx.ID_ANY,'AAA',size=(200,100)) self.btn2 = wx.Button(self, wx.ID_ANY,'BBB',size=(200,100)) font = wx.Font(20, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL) self.btn1.SetFont(font) self.btn2.SetFont(font) layout = wx.GridSizer(1,2,0,0) layout.Add(self.btn1,flag=wx.ALIGN_CENTER) layout.Add(self.btn2,flag=wx.ALIGN_CENTER) self.SetSizer(layout) def SetBitmap(self,bmp): self.bmp = bmp #フレームから得たbmpをself.bmpに格納 def on_paint(self, event): #背景描写 dc = wx.PaintDC(self) if self.bmp: image = wx.Image(self.bmp) w, h = self.GetSize() image = image.Scale(w , h, wx.IMAGE_QUALITY_HIGH) bitmap = wx.Bitmap(image) dc.DrawBitmap(self.bmp, 0, 0) def gifAnimation(filepath, setBitmap): anime = wx.adv.Animation(filepath) #gifをanimeに格納 from itertools import cycle for idx in cycle(range(anime.GetFrameCount())): #イテレータで無限ループ生成 delay = anime.GetDelay(idx) frame = anime.GetFrame(idx) yield delay # ジェネレータでdelay生成 setBitmap(frame.ConvertToBitmap()) #フレームをBitmapに変換し格納 if __name__ == '__main__': application = wx.App() frame = menuFrame() frame.Show() genx = callLaterTimedGen(gifAnimation("X.gif", MenuPanel.SetBitmap)) #callLaterTimedGenにSetBitmapを入れたgifAnimationを入力 application.MainLoop()
参考サイト
https://teratail.com/questions/281917
補足情報(FW/ツールのバージョンなど)
python3.8.5
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/14 13:43
2021/01/14 22:07
2021/01/15 14:13
2021/01/15 14:17