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

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

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

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

Tkinter

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

Python

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

Q&A

解決済

1回答

1610閲覧

【Python】【Tkinter】1つ前のプルダウンメニューの選択によって2つ目以降のメニューリストの取得内容を変えていきたい

CurePython

総合スコア1

Python 3.x

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

Tkinter

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

Python

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

0グッド

0クリップ

投稿2020/11/18 08:27

前提・実現したいこと

4つのプルダウンメニューを作成し、1つ目のプルダウンメニューの取得値によって2つ目のプルダウンメニューのリスト内容が変わる。これを4つ全てのプルダウンメニューで行っていく。
例では、1つ目のプルダウンメニューに「上半身、下半身」を格納し、上半身を選ぶと2つ目のプルダウンメニューで「頭、胸、腹」が選べるようになる。2つ目のプルダウンメニューで頭を選ぶと、3つ目のプルダウンメニューで「口、目」が選べるようになる。というように連続してプルダウンメニューの値をあとのプルダウンメニューへ渡していきたい。

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

2つ目までのプルダウンメニューのリストは取得できるが、3つ目のプルダウンメニューからリストを取得することができない

該当のソースコード

#プルダウンメニュー(1つ目)の選択によるリスト取得 def cb2_selected(event): var1 = cb1.get() if var1 == '上半身': val1 = ('頭', '胸', '腹') elif var1 == '下半身': val1 = ('脚') else: val1 = ('') cb2 = ttk.Combobox(main_win, state='readonly') cb2['value'] = val1 cb2.grid(row=1, column=1) #プルダウンメニュー(2つ目)の選択によるリスト取得 def cb3_selected(event): var2 = cb2.get() if var2 == '頭': val2 = ('口', '目') elif var2 == '胸': val2 = ('胸', '腕') elif var2 == '腹': val2 = ('へそ') elif var2 == '脚': val2 = ('もも', 'あし') else: val2 = ('') cb3 = ttk.Combobox(main_win, state='readonly') cb3['value'] = val2 cb3.grid(row=1, column=2) #プルダウンメニュー(3つ目)の選択によるリスト取得 def cb4_selected(event): var3 = cb3.get() if var3 == '口': val3 == ('歯') elif var3 == '目': val3 = ('瞳') elif == '胸': val3 = (' ') elif var3 == '腕': val3 = ('手', '指') elif var3 == 'へそ': val3 = (' ') elif var3 == 'もも': val3 = (' ') elif var3 == '足': val3 = ('指') else: val3 = ('') cb4 = ttk.Combobox(main_win, state='readonly') cb4['value'] = val3 cb4.grid(row=1, column=3) #プルダウンメニューのバインド設定 cb1.bind('<<ComboboxSelected>>', cb2_selected) cb1.bind('<<Return>>', cb2_selected) cb2.bind('<<ComboboxSelected>>', cb3_selected) cb2.bind('<<Return>>', cb3_selected) cb3.bind('<<ComboboxSelected>>', cb4_selected) cb3.bind('<<Return>>', cb4_selected)

試したこと

以前の投稿で、1つ目のプルダウンメニューの取得値によって2つ目のプルダウンメニューのリスト内容が変わっていく、という内容の質問があり、それを参考にして今回のプログラムを作成しましたがうまくいかなかった。
cb2の値をget()で取得できていないようですが、それの原因は不明。

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

実行環境
Windows10
Python 3.8.5

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

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

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

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

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

guest

回答1

0

ベストアンサー

cb2の値をget()で取得できていないようですが、それの原因は不明。

cb2 の Combobox が 各関数内部でローカル変数に作成されているからです。
別の関数内のグローバル変数の cb2 は別のウィジェットを指してます。

掲載されてるコードの範囲外だと思うので、何処か解りませんが、
cb2.bind としているので、何処かグローバルでウィジェットを作っているなら、
ウィジェットの作成を最初の一度のみにすることで解消できます。

各関数内では、既に生成済みのウィジェットに対して、
アイテムの値のみを変更します。


python

1 2cb2 = ttk.Combobox(...) 3 4def cb2_selected(event): 5 cb2 = ttk.Combobox(...) # <--- ここが不要 6 # この cb2 はローカル変数になってしまう 7 8def cb3_selected(event): 9 cb2.get() # はグローバル変数の combobox を参照する 10 11cb2.bind(...)

投稿2020/11/18 12:28

編集2020/11/18 12:31
teamikl

総合スコア8760

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

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

CurePython

2020/11/19 01:31

丁寧な解説ありがとうございます。 グローバル変数とローカル変数は盲点でした。 無事にリスト内容の取得ができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問