🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2165閲覧

wx.pythonで背景が動画のように動いているGUIを作成したい

able

総合スコア7

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/01/13 14:11

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下でよろしいのではないでしょうか。

python

1 def SetBitmap(bmp): 2 self.bmp = bmp #フレームから得たbmpをself.bmpに格納

もしくは、同様のエラーの対処が記載されています。いずれかがご参考になりますでしょうか。

missing 1 required positional argument が出てしまいます

TypeError: init() missing 1 required positional argument: 'bonus' というエラーメッセージ

【python】missing 1 required positional argument の修正方法

missing 1 required positional argumentのエラー

投稿2021/01/13 14:24

_whitecat_22

総合スコア1305

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

able

2021/01/14 13:43

whitecat_22様 ご回答ありがとうございます。 ご指摘ののように引数をbmpだけにしてみたのですが、「name 'self' is not defined」というselfが定義されていないというエラーが出てしまいました。
_whitecat_22

2021/01/14 22:07

失礼いたしました。逆ですね、元のエラーが'bmp'という引数が無いです、ということですが、bmpという引数を与えるか、インスタンス化するという対処が必要です。 ※selfは残して、元の、def SetBitmap(self, bmp): としてください。 インスタンス化については、以下が参考になるかと思います。 【python】missing 1 required positional argument: 'self'などの対処法 https://www.haya-programming.com/entry/2018/10/05/233418
able

2021/01/15 14:13

whitecat_22様 ご返信ありがとうございます。 インスタンス化を試してみましたが、うまくいきませんでした。 その後、試行錯誤を重ねた結果、def SetBitmap(bmp): にし、コード内のself.bmpをMenuPanel.bmpに変えてみたらなぜかうまく動かすことができました。 アドバイスありがとうございました。
_whitecat_22

2021/01/15 14:17

そうでしたか、、 あまりお役に立てませんでしたが、解決できたようで安心しました。 私ももっと勉強します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問