質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

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

Q&A

解決済

1回答

1776閲覧

wxpythonで背景画像の表示方法について

NinZIn2010

総合スコア2

Python 3.x

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

0グッド

0クリップ

投稿2021/08/12 03:54

編集2021/08/12 05:04

python

1import wx 2import os 3import webbrowser 4import subprocess 5import configparser 6import shutil 7import time 8 9class mainFrame(wx.Frame): 10 def __init__(self): 11 super().__init__(None, wx.ID_ANY, '●●●', size=(900,600), style=wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.MINIMIZE_BOX | wx.CLIP_CHILDREN) 12 13 self.CreateStatusBar() 14 self.SetStatusText('●●●') 15 self.GetStatusBar().SetBackgroundColour(None) 16 17 self.sizer = wx.BoxSizer(wx.VERTICAL) 18 self.SetSizer(self.sizer) 19 20 self.set_screen(Panel_1) 21 self.CreateStatusBar() 22 self.SetStatusText( "●●●") 23 24 def set_screen(self,panel): 25 self.sizer.Clear(False) 26 self.DestroyChildren() 27 28 self.now_panel=panel(self) 29 self.sizer.Add(self.now_panel,1,wx.EXPAND) 30 self.sizer.Layout() 31 32途中のパネルについては一旦省きます 33 34if __name__ == '__main__': 35 36 application = wx.App() 37 frame = mainFrame() 38 frame.Show() 39 application.MainLoop() 40 41

この作成したフレームの中で以下のコードで画像を背景として利用したいと思いました

python

1 imag3 = wx.Image(soutai +r"\allpaper\paper.png") 2 img3 = imag3.Scale(900,600, wx.IMAGE_QUALITY_HIGH) 3 bmp3 = img3.ConvertToBitmap() 4 wx.StaticBitmap(self, -1, bmp3, pos=(0,0), size=(900,600)) 5

しかしいざ挿入してみると画像は表示されたもののボタンなどが表示されず画像の画面だけが表示されました。
実現したい内容としては背景画像がきちんと表示されその画像上にボタンやテキストなどが消えずに表示させるにはどのようにすればよいのでしょうか?
<実行した事>
様々な場所で検証したり、他のインターネット上で調べたりしたもののわかりませんでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

レイアウトの問題だと思いますが、
コードの省略された部分が不明瞭な為、問題個所を特定できません。

不要な部分は省略したうえで、下のコードを上のコード内に適応させ、
実行可能&問題が再現なコードを提示して頂けますか。

症状から推測すると、
button4 がきちんとレイアウト (sizer) 内に配置されてない、可能性がります。

# ウィジェット・レイアウトの構成 mainFrame: wx.Frame sizer: wx.BoxSizer now_panel: panel button4 # フレームにレイアウトを用いず直接置かれた状態、孤立している

下のコードが何処に書かれたかによっても変わってきます。(省略されて解らない・不明瞭な点)
フレーム内に表示したい場合は、button4 の親は panel で、
レイアウトを用いて配置されていなければなりません。

解決策は、どのように表示したいかによって、
レイアウトやウィジェットの親子関係の構成方法は変わってきます。

訂正: 背景画像の上にウィジェットを配置

button4 もしくはその親ウィジェットが sizer に配置されるようにすることで、
画像だけが表示される問題については、解消できるはずです。

解決案(状況次第):

  • A: EVT_ERASE_BACKGROUND イベントで、背景にビットマップを描画する方法
  • B: StaticBitmap 上に、座標指定でウィジェット配置
  • C: 表示順の制御 (Raise/Lower)

投稿2021/08/12 04:42

編集2021/08/12 05:55
teamikl

総合スコア8664

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

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

NinZIn2010

2021/08/12 05:09

ミスがありました。返答頂いたのに申し訳ございません。 追加の情報としてですが、  上記でも言ったことなのですが、画面はには指定した画像自体は反映されていはいるのですがその画面の上に来てほしいボタンやテキストが全て表示されないです。  正確には一度ボタンがある座標にマウスカーソルを合わせてあげると表示されるのですが起動した直後は作られたフレームには指定した画像以外が出てこない状態です。  これを改善したくて質問させていただきました。 ミスがあったことをお詫びします。  そのうえで今この状態についてのご返答いただければと思います。
teamikl

2021/08/12 05:52 編集

画像の上にウィジェットを配置だったのですね。 何れにしても、省略された箇所が影響する可能性が大きい為、 正確な状況が把握できません。 提示されてるコードの掲載範囲は問題点の外側で、 下のコードが上のコード内のどの場所にあるかが重要な情報になります。 panel 関数のコードが長い場合は、全てではなくて良いので 背景画像とその上に配置予定のウィジェット1つのコードを提示して見て下さい。 ---- 背景画像の表示方法としては、主に2通りの方法があります (A)(B) 現状のコード次第では、(C)の対策が取れる可能性もあります。 (A) パネルの EVT_ERASE_BACKGROUND イベントで背景描画 参考: https://www.blog.pythonlibrary.org/2010/03/18/wxpython-putting-a-background-image-on-a-panel/ ※ wxPython2.x の情報です。 (B) 背景画像を先に配置し、他のウィジェットを座標指定で配置  ※ 但し、この実装方法ではレイアウトと併用できません。 (C) 「マウスカーソルを合わせてあげると表示される」場合は、  表示順の操作(Raise/Lower)で対応できるかもしれません。(状況次第)
teamikl

2021/08/12 07:02

windowsにて、問題の症状を確認出来ました。 wxWidgetsライブラリはプラットフォーム毎に異なるバックエンドで動作するのですが、 プラットフォーム次第でStaticBitmapの挙動が異なる事があるようです。→ (B)の方法は環境依存 例えば、自分の試したケースでは StaticBitmap だと「カーソルを合わせた時に表示」となり、 BitmapButton では意図通りの順序で表示されました。 解決策としては、(A) の手法を推奨します。
NinZIn2010

2021/08/12 09:29

色々と丁寧に検証までありがとうございます。 (A)のやり方で一旦組んでみたいと思います
NinZIn2010

2021/08/12 09:57

(A)のやり方で進めていこうと思ったのですがきちんとした構文の書き方を理解ができませんでした。少し面倒をお掛けしますが少し EVT_ERASE_BACKGROUND イベントの説明をいただけませんか?
teamikl

2021/08/12 11:35

https://wxpython.org/Phoenix/docs/html/wx.EraseEvent.html 背景の再描画が要求された時に発呼されるイベントで、 任意の関数を呼び出す事が出来ます。 参考URLのサンプルコードは古いものなので、 構文に関しては、Python 2.x -> 3.x の読み替えも必要そうです。 目に付いた点では、print 構文 -> print() 関数呼び出しに変更してください。
NinZIn2010

2021/08/12 11:58

ありがとうございます。 試行錯誤してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問