つきすけ の コーディング記

細かいところで嫌にならないように、小さいことでも解説していくブログ。たまに関係ないことも書く。

Python の Tkinter で文字列にリンクをはる

文字列の内部にリンクをはり、押したらウェブに飛んで欲しい。
※ここでいう文字列とは、Labelウィジェットのこと。
※例によって、python2系ではtkinterTkinterと書き直してみてください。

デモ

とりあえずやってみる。
インデントに気をつけつつコピペして動作を確認するのがおすすめ。このブログに飛びます。

import tkinter
import webbrowser

# ---------- 大事なところ1 ---------                                           
# リンクで飛ぶための関数を作る(コピペOK)                                      
def jump_to_link(url):
    webbrowser.open_new(url)
# -----------------------------------                                           

# -- 基本的なところ(本質ではない)--                                           
# とりあえずLabelに文字列をいれて表示。あとは適当に装飾                         
window = tkinter.Tk()
window.geometry("500x300")
window.title("Text Link")

canvas = tkinter.Canvas(width=510, height=200, background="#eee")
canvas.place(x=-5, y=50)

text = tkinter.Label(canvas, text="つきすけ の コーディング記", foreground="#\
449", cursor="star")
text.place(x=150, y=90, anchor=tkinter.NW)
# ----------------------------------                                            

# --------- 大事なところ2 ---------                                            
# さっき書いたtextにリンクをはる                                                
text.bind("<Button-1>", lambda e:jump_to_link("https://tsukisuke.hateblo.jp/"))
# ---------------------------------                                             

window.mainloop()

実行結果
Tkinter上で開いているように見えるが、普通にブラウザで開く)

ラベルを押すとWebページに飛ぶ様子

細かい解説。

大事なところ1

2行目 : "webbrowser"をimport(標準モジュール)
6,7行目 : リンクで飛ぶための関数(ここではjump_to_link)を定義

大事なところ2

さっきLabelを定義した変数(今回はtext)に対して、さっき定義した関数を用いて

text.blid("<Button-1>", lambda e:jump_to_link("飛びたいサイトのURL"))

と書く。なお、<Button-1>は左クリックのことを表しているようだ。

補足

Labelを定義したとき、cursor="hand1"などで適当にカーソルを定義しておくと、マウスを重ねた時にアイコンが変わってくれる。これをしないとカーソルが変化しないので"押せそう感"が失せる。