web-dev-qa-db-ja.com

Tkinterで透明なウィンドウを作成する方法はありますか?

最終的には、Tkinterモジュールを使用してPythonで「奇妙な形のウィンドウ」を作成しようとしています。しかし、今のところ、子ウィジェットを完全に維持しながら背景を透明にすることができるようになります。 -目に見える。

これがwxPythonや他のいくつかのモジュールで行われていることは知っていますが、Tkinterの制限について問い合わせています。

Tkinterは明確なキャンバスまたはフレームを作成できますか?キャンバスやフレームなしでUI要素をパックできますか?個々のUI要素を透過的にすることはできますか?

Zスタックでその下のウィンドウを処理するために、マウスクリックの場所をシステムに戻すことはできますか?

13
Paul Johnson

オプションroot.attributes('-alpha', 0.1)を使用して、透明なウィンドウを作成できます

from Tkinter import *
root = Tk()
root.attributes('-alpha', 0.3)
root.mainloop()

ただし、この場合、ルート上のウィジェットでさえ透明度を継承します。

Linux用のアップデート(Ubuntuでテスト済み)

上記のコードはLinuxマシンでは機能しません。 Linuxで動作するアップデートは次のとおりです。

from tkinter import Tk # or(from Tkinter import Tk) on Python 2.x
root = Tk()
root.wait_visibility(root)
root.wm_attributes('-alpha',0.3)
root.mainloop()

これがWindowsで機能するかどうかはわかりません。

18
bhaskarc

2019年後半の要約:

TCL/TKバージョン8.6以降、alphafullscreen、およびtopmostウィンドウ属性はすべてのプラットフォーム(Windows、Mac、およびLinux)で機能します。

https://www.tcl.tk/man/tcl8.6/TkCmd/wm.htm#M9

マニュアルの以前のバージョンでは、以前はプラットフォームの違いがあったと記載されていました(一部のプラットフォームのみがこれらの3つの属性をサポートしていました)。ただし、最新のTCL/TKを使用している限り、これらすべての属性がすべてのプラットフォームで機能することが保証されます。

各ウィンドウ属性機能はオペレーティングシステムの基盤となるウィンドウマネージャーに依存しているため、LINUXにはまだプラットフォームの癖があります(MacとWindowsでは常に機能しますが、Linuxでは多数の異なるウィンドウマネージャー/コンポジターがあり、すべてが透過的をサポートしているわけではありませんウィンドウなど)。透過性がサポートされていない場合、後でもう一度読み込もうとすると、alphaプロパティは_1.0_のままになると書かれています。ただし、このページでは、Linux(X11)では属性が非同期に更新されるため、読み取った値を信頼できないことも示されています(アルファを変更してすぐに読み取ろうとすると、古い値が読み取られます)。 、そのため、そのメソッドを使用して、Linuxでアルファが正常に変更されたかどうかを確認することはできません)。

Linuxでroot.wait_visibility(root)を使用して、alpha属性を設定する前にウィンドウが画面に表示されていることを確認する必要があるという他の回答については、わかりません。チェックするLinuxマシンがありません。しかし、公式マニュアルにはアルファがサポートされていると書かれており、そのコマンドが必要であるとは何も述べていないので、私はそれがもう必要であると強く疑っています。いずれにせよ、_wait_visibility_トリックを追加しても問題はありません...これは、実際のウィンドウがユーザーの画面に表示されるまで待機する非常に短いイベントループを実行するコマンドです。したがって、すべての属性設定の前にそのコマンドを追加することをお勧めします。特にそれは証明済み Linux上のLinuxでアルファが機能するのを助けるためです古い TCL/TKバージョン! PS:_(root)_引数は必要ありません。代わりに、root.wait_visibility()と入力する必要があります。これは、「self(この場合はrootルートオブジェクトのコマンド) "。

0
Mitch McMabers