なんかいろいろこんぴゅーたかんけいのなぐりがき

なんか勉強しているこんぴゅーた関係のことのメモやそれ以外のことを書こうかなあ...

logs

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

wxPythonで透明なウィンドウに画像を描画する

ディスプレイに画像をウインドウなしで表示したかった。つまり、画像だけがパソコンの画面に表示されるようにしたかった。イメージがしにくかったらデスクトップアクセサリとかを想像すると何を言いたいのか分かってもらえるはず。

どうやらこの目的を果たすためには透明なウィンドウの上に画像を表示させ、あたかも画像だけが表示されているようにするみたいだった。

で、例のごとくTkinterでそんな感じのことができないものかと、試行錯誤してうまくいかず、とりあえずググるとどうやらTkinterで実現するのは難しいらしい。その代わりwxPythonモジュールを使えばいけそうだということだ。

ということで1時間ほどwxPythonの基本的なウィジェットのソースコードを読み終えたあと、今度はwxPythonでググってウィンドウを透明化する方法を見つけた。しかし、このとき見つけた方法では描画した画像も一緒に透明化してしまい、今回やりたいこととは少し違うものだった。

 気を取り直して検索を続行したがなかなか目的の手段について書かれたページがなかった、そもそも日本語でwxPythonについて書かれているページがほとんどない!!全くないわけではないが、欲しい情報が見当たらない。

 それでもめげずに検索していると、http://python.matrix.jp/projects/wxPython/ にはねまわるウイドウな例 というサンプルコードがあり、このサンプルコードが今回私のやりたいことの道しるべとなってくれそうだ。
 しかしこのコード、思ったより簡単でないのに加え、表示させるpng画像に対して一回よく分からん変換をして利用している。


よさげなサンプルを見つけてから1時間後:
…よく分からなかった。


 さらに検索を繰り返し、時折見つかるヒントを参考に試行錯誤し、作業開始から10時間後…:
とりあえず動いた!!すばらしい。現在の段階では透明なところはウインドウがないと扱われるが、画像が描画されているところはウイドウ扱いされているみたいなので、画像のところもウインドウ扱いされないようにしたいが、今日はここまでにしておこう。つかれた。土曜日返せ!!

以下、今回の成果物

import wx
class myFrame(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title=title,style = wx.NO_BORDER | wx.FRAME_SHAPED)
self.Bind(wx.EVT_PAINT, self.OnPaint)
image = wx.Image('keys2.png')
self.bitmap = image.ConvertToBitmap()

self.SetClientSize(image.GetSize())
self.SetShape(wx.RegionFromBitmapColour(self.bitmap,wx.Color(255,255,255)))

def OnPaint(self, event=None):
deviceContext = wx.PaintDC(self)
deviceContext.DrawBitmap(self.bitmap, 0, 0, True)

app = wx.App(False)
frame = myFrame(None, "none")
frame.Show()
app.MainLoop()



今回はまった点:pngに透過色を設定しているとなぜかうまくいかなかった。とにかく透過処理が大変だった。

qwer.jpg
スポンサーサイト

トラックバックURL

http://ilovevim.blog42.fc2.com/tb.php/122-9c78c47d

この記事へのトラックバック

この記事へのコメント

コメント投稿フォーム

Paging Navigation

Navigations, etc.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。