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

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

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

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

Tkinter

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

Q&A

解決済

3回答

4055閲覧

Pythonの複数listboxでエラーが出ます。

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2019/07/14 23:24

編集2019/07/15 01:52

イメージ説明### 前提・実現したいこと

前回の質問の仕方に不備が有りましたので、書き直しました。

クラスの継承機能については余り理解できておりませんが、カメラのEV値計算簡単アプリを作成中です。

listboxを二つ作りました。 listbox間を行き来したいのですが、listbox1で数値確定後、listbox2(或いはその逆)に移ると、動作は見たところ正しいのですがエラー表示が出ます。

宜しくお願い致します。

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

下記のエラーが表示されます Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\tak11\AppData\Local\Programs\Python\Python37\lib\tkinter\init.py", line 1705, in call return self.func(*args) File "C:\Users\tak11\デスクトップ\ISO_F_T-リストボックス検討1.py", line 47, in show_item self.label_2["text"] = self.listbox_2.get(item_index_2) File "C:\Users\tak11\AppData\Local\Programs\Python\Python37\lib\tkinter\init.py", line 2798, in get return self.tk.call(self._w, 'get', first) _tkinter.TclError: bad listbox index "": must be active, anchor, end, @x,y, or a number

該当のソースコード

#ISO_F_T-リストボックス検討1.py import tkinter as tk class TestListbox_1(tk.LabelFrame): def __init__(self, master=None): super().__init__(master, text="ISO") #Listbox self.listbox_1 = tk.Listbox(self, width=8, selectmode="extended") self.listbox_1.bind("<<ListboxSelect>>", self.show_item) li = ["50", "100", "200", "400", "800", "1600", "3200", "6400", "12800", "25600"] for item in li: self.listbox_1.insert(tk.END, item) self.listbox_1.pack() #表示用ラベル self.label_1 = tk.Label(self, text="ISO", bg="lightblue") self.label_1.pack() def show_item(self, event): #リストクリック時に実行するメソッド item_index_1 = self.listbox_1.curselection() self.label_1["text"] = self.listbox_1.get(item_index_1) class TestListbox_2(tk.LabelFrame): def __init__(self, master=None): super().__init__(master, text="絞り") #Listbox self.listbox_2 = tk.Listbox(self, width=8, selectmode="extended") self.listbox_2.bind("<<ListboxSelect>>", self.show_item) li = ["1.4", "2", "2.8", "4", "5.6", "8", "11", "16", "22", "32"] for item in li: self.listbox_2.insert(tk.END, item) self.listbox_2.pack() #表示用ラベル self.label_2 = tk.Label(self, text="絞り", bg="lightgreen") self.label_2.pack() def show_item(self, event): #リストクリック時に実行するメソッド item_index_2 = self.listbox_2.curselection() self.label_2["text"] = self.listbox_2.get(item_index_2) if __name__ == "__main__": root = tk.Tk() root.title("kumasanのEV計算機") root.geometry("300x400") iso = TestListbox_1(master=root) iso.place(x=20, y=20) aperture = TestListbox_2(master=root) aperture.place(x=120, y=20) root.mainloop()

試したこと

上記のcodeで動作はしていますが、エラーが出るということは何処かに間違いがあるのだと思います。

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

W10 64bit
Python3.7 

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

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

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

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

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

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

hayataka2049

2019/07/14 23:38

質問を編集する機能があるので、次からは質問の編集はそれで対応してください。
guest

回答3

0

ベストアンサー

エラーが発生する原因は大きく2つ。

1つ目は現状のコードではListboxのパラメータにてselectmode="extended" が設定されている為、ユーザーはリストから複数要素を選択することができます。その場合 show_item() コールバック内の処理の self.listbox_2.curselection() からは複数のIndexが入った タプルが戻ることとなり、結果self.listbox_2.get() がエラーが引起起こします。

例えば1番目の要素と2番目の要素を選択した場合、self.listbox_2.curselection() の戻り値は (0,1) となります。

リストから複数の要素を選択する必要がないのであれば、selectmode="single" とするとエラーは解消されると思います。

2つ目としては、"<<ListboxSelect>>" イベントは、Listbox が非アクティブに遷移した時(もう一つのListboxが選択された時)にもイベントがコールバックされ、その場合 show_item() コールバック内の処理の self.listbox_2.curselection() の結果としては空のタプルが戻り、この場合も当然self.listbox_2.get() にてエラーが発生します。

質問で報告されているエラーはコチラかと思います。

こちらは空のタプルの場合は後段の処理を行わないようにshow_item()関数内の処理を修正すると解決するかと思います。

Python

1 def show_item(self, event): 2 #リストクリック時に実行するメソッド 3 item_index_1 = self.listbox_1.curselection() 4 # リストが1つ以上選択されている場合だけ処理 5 if len(item_index_1) > 1: 6 self.label_1["text"] = self.listbox_1.get(item_index_1)

投稿2019/07/15 03:13

magichan

総合スコア15898

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

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

退会済みユーザー

退会済みユーザー

2019/07/15 05:25

下記の様に多少変更してエラーが出なくなりました。 def show_item(self, event): #リストクリック時に実行するメソッド item_index_1 = self.listbox_1.curselection() # リストが1つ以上選択されている場合だけ処理 if len(item_index_1) == 1: self.label_1["text"] = self.listbox_1.get(item_index_1) 多分これでいいのかなと思います。 意味合いなどはこれからじっくり考えてみます。  傘寿になってからのPythonは難しいですが、お陰様で少し進歩致しました。 有難うございました。
guest

0

手元の環境(python3.6 on ubuntu)で試してみましたが、状況が再現しませんでした。

なのでよくわからないのですが、とりあえず空文字列が入るケースでエラーになっているのなら、空文字列が取得されてしまったときは後ろの動作をやめれば済むと思われます。

python

1 # 1の方だけ。2にも必要なはず 2 def show_item(self, event): 3 #リストクリック時に実行するメソッド 4 item_index_1 = self.listbox_1.curselection() 5 if item_index_1 != "": 6 self.label_1["text"] = self.listbox_1.get(item_index_1)

あとは、本来はリファクタリングして冗長な記述を減らした方が良いでしょう。よくわからなければそのままでも構いません。

投稿2019/07/14 23:51

hayataka2049

総合スコア30933

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

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

退会済みユーザー

退会済みユーザー

2019/07/15 00:23

# 1の方だけ。2にも必要なはず def show_item(self, event): #リストクリック時に実行するメソッド 2にも入っております。 そしてlistbox2もしっかり表示されています。  errorの意味も分かりますが、Python経験不足で対応が分かりません。 もう少し勉強致します。 有難うございました。
hayataka2049

2019/07/15 00:26

えっと、そのコメントの意味は「1の方にだけif文を追加した例を示すので、1と2の両方で同じことをしてください」です。
退会済みユーザー

退会済みユーザー

2019/07/15 00:52

1と2の両方で同じcode(listbox-2と直してはあります)が入っておりますが?
hayataka2049

2019/07/15 00:59

空文字列の場合はself.label_2["text"] = self.listbox_2.get(item_index_2)などが実行されないよう、if文を追加してくださいという回答です。
退会済みユーザー

退会済みユーザー

2019/07/15 01:10

すみません「空文字列の場合」というのが分かりません。 getする際””になることがあるのでしょうか? お手数おかけします。
hayataka2049

2019/07/15 01:31

私の手元の環境では再現しませんでした。しかし、エラーは空文字列が渡っていることを示唆しているように思います。オブジェクト切り替わりのタイミングで選択がなされない状態のまま送信されてしまうのかもしれません。そうであれば回答の方法でエラーは出なくなるはずです。
退会済みユーザー

退会済みユーザー

2019/07/15 01:54

「私の手元の環境では再現しませんでした。」とはcodeが働かなかったということでしょうか? 動作図を挿入しました(陰でerrorが表示されます)。 ありがとうございました。
hayataka2049

2019/07/15 02:29

特にエラーが出ずに実行できた、という意味です。
hayataka2049

2019/07/15 03:37 編集

magichanさんの回答が正確なようです。私の回答の方法はあまり意味がなかったかもしれません。
退会済みユーザー

退会済みユーザー

2019/07/15 05:27

hayatake2049さん いや~じっくりエラーの意味合いを考える機会になりました。 大変勉強になりました、有難うございます。
guest

0

google翻訳
_tkinter.TclError: 無効なリストボックスインデックス "":アクティブ、アンカー、終了、@ x、y、または数字である必要があります

これでだいたいわかると思いますが、ListBoxのインデックスに””が与えられているというエラーですね
エラーが出ている箇所を調べてみよう

投稿2019/07/14 23:35

y_waiwai

総合スコア87747

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

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

退会済みユーザー

退会済みユーザー

2019/07/15 00:51

「ListBoxのインデックスに””が与えられているというエラー」:なぜ””になるのでしょうか? listbox間の数値は正しくget表示されているのですが? 継承をもう少し勉強します。 有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問