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

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

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

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

Q&A

解決済

1回答

1396閲覧

Python forでcomboboaxを複数作ったものからどれが変化したかを識別したい

hiker3776

総合スコア1

Python

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

0グッド

0クリップ

投稿2021/12/14 10:06

forで複数作成したcomboboxから、どれが変化したのかを識別して、
対応する内容をリストに反映したいと思います。

下記のようにして、変化した値を取得することはできたのですが、widgetの名前をトリガにして
何番目のcomboboxが変化したのかを確認しようと考えたのですが、エラーで上手くいきません。

エラー内容は、下記のようなもので、comboboxはreplaceできないことは理解したのですが、
print(mate_num.replace('.!labelframe3.mate_', ''))
AttributeError: 'Combobox' object has no attribute 'replace'
widget名に含まれる番号をキーにして、置き換えをしようと思ってたので、そこで止まってます。

これ以外の方法でもいいので、どのcomboboxが変化したのかを特定して、変数に落とす方法はないでしょうか?よろしくお願いします。

上半分は、今のところ確認用にPrintにしていますが、得られた数字の箇所のリストを変更するよにしようと考えてます。

def select_comb4(event):
print(event.widget.get()) # 変更したcomboboxの内容を取得
print(event.widget) # 変更されたwidgetの名前 これをキーにして何番目か特定したい
mate_num = root.nametowidget(event.widget)
print(mate_num.replace('.!labelframe3.mate_', ''))

プルダウンで選択するコンボボックスを配置
mate_no = ['' for j in range(20)]
for j in range(20): # 縦の行数
combo_box4 = ttk.Combobox(frame_DW, height=10, width=13, values=comb4, state='readonly',
textvariable=mate_no[j], font=('', 8, 'normal'), name=f'mate_{j}')
combo_box4.bind('<<ComboboxSelected>>', select_comb4)
combo_box4.place(x=5, y=65 + 20 * j)

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

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

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

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

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

hiker3776

2021/12/14 13:06

ありがとうございました。助かりました。
guest

回答1

0

ベストアンサー

Tkiner のウィジェットは、str() で識別子を文字列で得られます。

python

1print(str(event.widget).replace('.!labelframe3.mate_', ''))

functools.partial を使うと、bind 時に引数を渡すこともできます。

python

1 2from functools import partial 3 4 5def select_combo(idx, event): 6 print(f"{idx} 番目: {event.widget}") 7 ... 8 9for idx, _ in enumerate(range(20), start=1): 10 combo = ttk.Combobox(...) 11 combo.bind("<<ComboboxSelected>>", partial(select_combo, idx)) 12 ... 13

投稿2021/12/14 11:56

teamikl

総合スコア8664

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

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

hiker3776

2021/12/15 10:18

partial 、enumerate は知らなかったので、勉強になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問