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

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

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

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

Python

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

Q&A

解決済

3回答

281閲覧

tkinter、comboboxでの値取得して他で使用する方法

geant-kami

総合スコア20

Tkinter

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

Python

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

1グッド

1クリップ

投稿2025/04/12 19:03

実現したいこと

tkinterでのcomboboxを用いた値取得をして,他で使用したい。

発生している問題・分からないこと

イベント発生時に実行する関数で値は取得できるが,その取得した値を他で使用する方法がわからない。
例えば選択肢1を選んだ時に,def文のselected_valueに値を入れると,returnで返ってこないのはなぜでしょうか。

該当のソースコード

import tkinter as tk from tkinter import ttk option = ["選択肢1", "選択肢2", "選択肢3"] def show_selection(event): selected_value = combo.get() # 選択された値を取得 return selected_value root = tk.Tk() combo = ttk.Combobox(root, values=option) combo.pack(pady=20) combo.bind("<<ComboboxSelected>>", show_selection) print(show_selection) root.mainloop()

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

function show_selection at 0x000001C67374A940 が返ってきた。

補足

特になし

tatsu99👍を押しています

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

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

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

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

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

melian

2025/04/12 23:40 編集

> def文のselected_valueに値を入れると,returnで返ってこない > function show_selection at 0x000001C67374A940 が返ってきた。 print(show_selection) としているので、実行結果ではなく show_selection 関数(callable object)そのものが表示されています。 イベントドリブンなプログラムでコールバック関数を直接呼び出すことはしないのですが、例として「選択肢1」を選択した状態でshow_selection() を実行してみます。(引数のイベントオブジェクトは None にしています) root = tk.Tk() combo = ttk.Combobox(root, values=option) combo.current(0) combo.pack(pady=20) combo.bind("<<ComboboxSelected>>", show_selection) print(show_selection(None)) # print(combo.get()) root.mainloop() # 「選択肢1」と表示されます
geant-kami

2025/04/13 02:58

回答ありがとうございます。しかし実際はcombo.current(0)のところを動的にしたいのと, if selected_value == '選択肢2': x = 'hoge' if selected_value == '選択肢3': x = 'hogehoge' というようにしてxの値が欲しいのですが。どうでしょうか。
guest

回答3

0

ベストアンサー

というようにしてxの値が欲しいのですが。

クラス化してみてはどうでしょうか。

python

1import tkinter as tk 2from tkinter import ttk 3from tkinter import messagebox 4 5class Main(): 6 def __init__(self): 7 self.root = tk.Tk() 8 self.options = {'選択肢1': 'default value', 9 '選択肢2': 'hoge', 10 '選択肢3': 'hogehoge'} 11 self.x = '' 12 self.combo = ttk.Combobox(self.root, values=[*self.options.keys()]) 13 self.combo.pack(pady=20) 14 self.combo.bind('<<ComboboxSelected>>', self.get_selection) 15 self.button = ttk.Button(self.root, text='show value', command=self.show_value) 16 self.button.pack() 17 self.root.mainloop() 18 19 def get_selection(self, event): 20 selected = self.combo.get() # 選択された値を取得 21 self.x = self.options.get(selected, '') 22 23 def show_value(self): 24 messagebox.showinfo('value', self.x) 25 26if __name__ == '__main__': 27 Main()

投稿2025/04/13 04:04

編集2025/04/13 04:18
melian

総合スコア21095

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

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

geant-kami

2025/04/13 06:00

これを参考にできそうです! ありがとうございました。感謝申し上げます。
guest

0

GUIイベントを発生させたときに関数show_selectionが呼び出されますが、
この関数でreturnしても戻り値はあくまでtkinter自体が使用するだけでコード全体(グローバル)で使用することはできません。

単純にグローバル変数を使う方法もありますが、Stringvarを使用する方がいいでしょう。

python

1import tkinter as tk 2from tkinter import ttk 3 4def use_selection(): 5 print("現在の選択値:", selected_value.get()) 6 7root = tk.Tk() 8option = ["選択肢1", "選択肢2", "選択肢3"] 9 10selected_value = tk.StringVar() 11combo = ttk.Combobox(root, textvariable=selected_value, values=option) 12combo.pack(pady=20) 13 14btn = tk.Button(root, text="値を使う", command=use_selection) 15btn.pack() 16 17root.mainloop() 18

投稿2025/04/12 23:43

編集2025/04/12 23:48
Black_Velvet

総合スコア114

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

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

geant-kami

2025/04/13 02:36

回答ありがとうございます。selected_valueをその後 if selected_value.get() == '選択肢3': x = 'Hoge' という様にしたいときはどうしたらよいでしょうか。
Black_Velvet

2025/04/13 04:02

print("現在の選択値:", selected_value.get())の代わりにそれを入れるだけです
geant-kami

2025/04/13 05:11

入れた後にそのxはdef文の外で使うにはどうしたらよいのでしょうか。
Black_Velvet

2025/04/13 05:57

グローバル変数をつかうってもんでしょうね 3行目から6行目の間に --------------------------------------------------------- x = None def use_selection(): global x if selected_value.get() == '選択肢3': x = 'Hoge' --------------------------------------------------------- を入れてみてください その後xはどこでしようしてもOKです
geant-kami

2025/04/13 06:06

回答ありがとうございます。 ベストアンサーは別の方を選ばせていただきましたが、こちらの回答も非常に参考になりました。
guest

0

例えば選択肢1を選んだ時に,def文のselected_valueに値を入れると,returnで返ってこないのはなぜでしょうか。

bindしたイベントから呼ばれた関数の返り値は無視/破棄されてしまうという仕様だからです。返り値を取得する方法はありません。
tkinterに限らず、GUIのアプリではこういう仕様になっていることが多いです。

イベント発生時に実行する関数で値は取得できるが,その取得した値を他で使用する方法がわからない。

コールバック関数から値を返り値として返すことができないので、結果的に副作用を使うことになります。
1つの方法は、他の方の回答にあるとおり、グローバル変数やインスタンス変数を利用する方法です。アプリケーションとしてそのような変数が複数ある場合は、辞書をいくつか用意して、使うようにするとすっきりする場合があります。
別の方法として、値が必要になったタイミングで、都度、GUIのパーツから値を取得する方法です。ダイアログなどの場合も破棄せず非表示にしておくことで、値は保持できるのでいつでも値を取り出すことができます。

投稿2025/04/13 05:26

TakaiY

総合スコア14238

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

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

geant-kami

2025/04/13 05:49

回答ありがとうございます。 その様な仕様になっているのですね。非常に参考になりました。感謝申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問