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

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

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

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

Tkinter

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

7028閲覧

Tkinterのリストボックスで、要素ごとにbindするには

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Tkinter

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2018/03/27 06:57

前提・実現したいこと

tkinterでURLのリストをリストボックスに表示し、URLをクリックするとそのページにジャンプするプログラムを作っています。

発生している問題・エラーメッセージ

どのURLをクリックしてもアマゾンのサイトに飛んでしまいます。
表示されるURLと実際のリンクを対応させるにはどうしたらいいでしょうか?

該当のソースコード

Python3

1from tkinter import * 2from tkinter import ttk 3import webbrowser 4 5def urljump(url): 6 webbrowser.open_new(url) 7 8urls = ['https://www.google.co.jp', 'https://www.yahoo.co.jp/', 'https://www.amazon.co.jp/'] 9 10root = Tk() 11root.title(u'Url Getter') 12root.geometry("300x300") 13 14frame = Frame(root) 15frame.grid() 16 17listbox1 = Listbox(frame, width=30, cursor="hand2") 18for url in urls: 19 listbox1.insert(END, url) 20 listbox1.bind("<<ListboxSelect>>", lambda event: urljump(url)) 21listbox1.grid(row=1, column=0) 22 23scrollbar = Scrollbar(frame, orient=VERTICAL, command=listbox1.yview) 24listbox1['yscrollcommand'] = scrollbar.set 25scrollbar.grid(row=1, column=1) 26 27root.mainloop()

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

◇問題点1
ループごとにListboxSelectイベントをバインドしている。そのためイベントが毎回上書きされていますー。

Python

1for url in urls: 2 listbox1.insert(END, url) 3 listbox1.bind("<<ListboxSelect>>", lambda event: urljump(url)) # ←ここ!

◇問題点2
urlの値が評価されてbindされている。
この場合だとlistの最終要素のamazonwが設定されます。
listbox1.bind("<<ListboxSelect>>", lambda event: urljump(url))

以下のコードでどうでしょうか。

Python

1# -*- coding: utf8 -*- 2from tkinter import * 3from tkinter import ttk 4import webbrowser 5 6 7def urljump(event): 8 widget = event.widget 9 # 選択された要素のindexを取得 10 index = int(widget.curselection()[0]) 11 url = widget.get(index) 12 print(url) 13 webbrowser.open_new(url) 14 15 16def main() -> None: 17 urls = ['https://www.google.co.jp', 'https://www.yahoo.co.jp/', 'https://www.amazon.co.jp/'] 18 19 root = Tk() 20 root.title(u'Url Getter') 21 root.geometry("300x300") 22 23 frame = Frame(root) 24 frame.grid() 25 26 listbox1 = Listbox(frame, width=30, cursor="hand2") 27 for url in urls: 28 listbox1.insert(END, url) 29 listbox1.bind("<<ListboxSelect>>", urljump) 30 listbox1.grid(row=1, column=0) 31 32 scrollbar = Scrollbar(frame, orient=VERTICAL, command=listbox1.yview) 33 listbox1['yscrollcommand'] = scrollbar.set 34 scrollbar.grid(row=1, column=1) 35 36 root.mainloop() 37 38 39if __name__ == '__main__': 40 main() 41

投稿2018/03/27 07:34

umyu

総合スコア5846

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

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

umyu

2018/03/27 07:34

かぶった・・・
退会済みユーザー

退会済みユーザー

2018/03/27 09:17

ありがとうございました。 ちゃんと動きました。
guest

0

ベストアンサー

こんな感じでいけるかと思います。

Python

1from tkinter import * 2from tkinter import ttk 3import webbrowser 4 5def urljump(evt): 6 wgt = evt.widget 7 idx = wgt.curselection()[0] 8 url = wgt.get(idx) 9 webbrowser.open_new(url) 10 11urls = ['https://www.google.co.jp', 'https://www.yahoo.co.jp/', 'https://www.amazon.co.jp/'] 12 13root = Tk() 14root.title(u'Url Getter') 15root.geometry("300x300") 16 17frame = Frame(root) 18frame.grid() 19 20listbox1 = Listbox(frame, width=30, cursor="hand2") 21for url in urls: 22 listbox1.insert(END, url) 23listbox1.bind("<<ListboxSelect>>", urljump) 24listbox1.grid(row=1, column=0) 25 26scrollbar = Scrollbar(frame, orient=VERTICAL, command=listbox1.yview) 27listbox1['yscrollcommand'] = scrollbar.set 28scrollbar.grid(row=1, column=1) 29 30root.mainloop()

投稿2018/03/27 07:29

magichan

総合スコア15898

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

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

退会済みユーザー

退会済みユーザー

2018/03/27 09:17

ありがとうございました。 urljumpのなかに print(wgt)を入れたらURLをクリックしたときに .!frame.!listbox と返ってきましたがこの!はどういう意味ですか?
magichan

2018/03/27 23:35

遅くなりました。 申し訳ありませんが、 widgetをprintした際の '!' の意味に関しましては 明確な回等を持ち合わせておりません。 (そもそも私の環境では、そのような表記が出力されません) とりあえず、urljump関数内で wgt = evt.widget で得られる widget は最初に listbox1 = Listbox(frame, width=30, cursor="hand2") にて生成した Listboxになりますので、Listboxの実装の __repr__や__str__ を確認したら、何かわかるかもしれませんね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問