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

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

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

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

1回答

6859閲覧

画像の上のボタンの透過化

shuoga

総合スコア2

Python 3.x

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

0クリップ

投稿2021/06/03 01:17

前提・実現したいこと

フレームの上にカンバスを作ってその上に画像を張り付けているが、ボタンをその画像の上に表示するといかにも不格好で原色なので、枠をなくしたい、文字のみ表示させてほしい。

該当のソースコード

python

1#coding:shift-jis 2import tkinter as tk 3from PIL import Image, ImageTk 4 5 6 def __init__(self, *args, **kwargs): 7 # 呪文 8 tk.Tk.__init__(self, *args, **kwargs) 9 10 # ウィンドウタイトルを決定 11 self.title("Tkinter change page") 12 13 # ウィンドウの大きさを決定 14 self.geometry("800x600") 15 16 # ウィンドウのグリッドを 1x1 にする 17 # この処理をコメントアウトすると配置がズレる 18 self.grid_rowconfigure(0, weight=1) 19 self.grid_columnconfigure(0, weight=1) 20 21#-----------------------------------main_frame(start)---------------------- 22 23 # メインページフレーム作成 24 self.main_frame = tk.Frame() 25 self.main_frame.grid(row=0, column=0, sticky="nsew") 26 27 # 画像読み込み 28 img = Image.open("rpg_bg1.jpg") 29 30 # 画像表示用キャンバス 31 self.canvas = tk.Canvas(self.main_frame,bg="white",height=600,width=800) 32 self.canvas.place(x=0,y=0) 33 34 # 画像貼り付け 35 self.tk_image = ImageTk.PhotoImage(image=img) 36 self.canvas.create_image(0, 0, anchor="nw", image=self.tk_image) 37 38 # タイトルラベル作成 39 self.titleLabel = tk.Label(self.main_frame, text="Quest", font=('Helvetica', '40'),bg="white",fg="red") 40 self.titleLabel.pack(anchor='n') 41 42 # フレーム1に移動するボタン 43 self.changePageButton = tk.Button(self.main_frame, text="START",font=('Helvetica', '40'), command=lambda : self.changePage(self.frame1)) 44 self.changePageButton.pack(anchor='s',expand = True) 45 46 # 動作終了ボタン 47 self.endButton = tk.Button(self.main_frame, text= "END", command=lambda : App.destroy(self)) 48 self.endButton.pack(anchor='center') 49 50#-------------------------------------------------------------------------- 51. 52. 53. 54 #main_frameを一番上に表示 55 self.main_frame.tkraise() 56 57 def changePage(self, page): 58 ''' 59 画面遷移用の関数 60 ''' 61 page.tkraise() 62 63if __name__ == "__main__": 64 app = App() 65 app.mainloop() 66

補足情報(FW/ツールのバージョンなど)

Python 3.7.1
Win

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

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

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

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

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

teamikl

2021/06/03 05:14

ソースコードを実行可能な形で掲載出来ますか。 エラーが出ている場合であれば、該当箇所だけで判明することも有りますが 動作確認するには、省略された部分を推測で埋めないといけない為。 画像等の外部ファイルも、準備しないと実行できないので、 質問と直接関係なければ省いても構いません。 (キャンバスを適当な背景色にすれば、透過は確認出来る為)
guest

回答1

0

ベストアンサー

現行の Tkinter 内部の Tcl/Tk が、あまりアルファチャンネルに対応してません。

プラットフォーム次第では部分対応してますが、
恐らく質問のケースに適合するものではないので、
対策としては、代替の手段を模索することになります。

簡単なのは、ボタン・ウィジェットの利用を辞めて
キャンバスに直接、透過画像やテキストへクリックイベントを実装する方法です。
(但し、クリック時の押下アニメーション等はなくなる)

python

1import tkinter as tk 2 3root = tk.Tk() 4canvas = tk.Canvas(root, width=400, height=400, 5 bg="blue") 6 7def onclick(e): 8 print("Start") 9 10item = canvas.create_text(100, 100, text="start", font=("", 40)) 11canvas.tag_bind(item, "<Button-1>", onclick) 12 13canvas.pack(fill=tk.BOTH, expand=tk.YES) 14root.mainloop()

ページ遷移との兼ね合いかもしれませんが、
Frame と Canvas を個別に配置してるのは、
Canvas 内に配置した方が良いです。

Cnavas 内にウィジェットを配置したい場合は、create_window を使います。
タイトルも、create_text にすれば、枠の部分は無くなります。

要点:

  • キャンバスへ create_text でテキスト生成
  • tag_bind でイベント登録

関連: 他の使えそうな方法。実装の手段・手間等は異なります。(未検証)

 半透明ではなく、文字のみ残した透過は、マスクを使う等の工夫が必要です。

 フレームの透過(※OS依存)

 透過キャンバスを重ねる方法

投稿2021/06/03 05:53

teamikl

総合スコア8760

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問