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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python 3.x

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

Tkinter

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

Q&A

解決済

1回答

2934閲覧

tkinter のcombobox グループ化は可能でしょうか?

zono_daiichi

総合スコア13

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python 3.x

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

Tkinter

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

0グッド

1クリップ

投稿2017/12/27 07:54

編集2017/12/27 09:47

イメージ説明
上記、label frame(name)の中にあるcomboboxをグループ化することは可能でしょう?

フォームはtkinterでデータベースはsqlite3です。

目的として、name frame 内に『あ行』、『か行』、『さ行』、『た行』、『な行』、『は行』、『ま行』、『や行』に配置してそれぞれ名前が入力されています。nameの枠内で『あ行』が選択され名前が選ばれたら、他の『か行』、『さ行』、『た行』、『な行』、『は行』、『ま行』『や行』が選択されないようにしたのですが、上手く行きません。

試したことは、radiobuttonのグループ化と同じ手順で試みましたが上手く行きません。
詳しい方がおられたらご指導ください

ソースコードは以下のとおりです

import tkinter as tk import tkinter.ttk as ttk import sqlite3 import tkinter.messagebox as msg frame12 = tk.LabelFrame(root,bd=2,relief="ridge",text=" name ",width=250,height=300,foreground="purple") frame12.place(x=10,y=0) #あ行# labe20 = tk.Label(frame12,text=" あ行 ",width=4,height=2) labe20.grid(row=0,column=0) val = tk.StringVar() box20 = ttk.Combobox(frame12, values = (" ","相田イチロウー","飯田ハナコ"), textvariable=val, state='readonly',width=8,height=2) box20.current(0) #初期値を'(index=0)'に設定 box20.grid(row=0,column=1,padx=6,ipady=3) #か行# labe21 = tk.Label(frame12,text=" か行 ",width=4,height=2) labe21.grid(row=0,column=2) val = tk.StringVar() box21 = ttk.Combobox(frame12, values = (" ","金田イチロウ","金山ハナコ"), textvariable=val, state='readonly',width=8,height=2) box21.current(0) #初期値を'(index=0)'に設定 box21.grid(row=0,column=3,padx=6,ipady=3) #さ行# labe22 = tk.Label(frame12,text=" さ行 ",width=4,height=2) labe22.grid(row=1,column=0) val = tk.StringVar() box22 = ttk.Combobox(frame12, values = (" ","塩田イチロウ","白石ハナコ"), textvariable=val, state='readonly',width=8,height=2) box22.current(0) #初期値を'(index=0)'に設定 box22.grid(row=1,column=1,padx=6,ipady=3) #た行# labe23 = tk.Label(frame12,text=" た行 ",width=4,height=2) labe23.grid(row=1,column=2) val = tk.StringVar() box23 = ttk.Combobox(frame12, values = (" ","髙山イチロー"), textvariable=val, state='readonly',width=8,height=2) box23.current(0) #初期値を'(index=0)'に設定 box23.grid(row=1,column=3,padx=6,ipady=3) #な行# labe24 = tk.Label(frame12,text=" な行 ",width=4,height=2) labe24.grid(row=2,column=0) val = tk.StringVar() box24 = ttk.Combobox(frame12, values = (" ","中嶋イチロー","野里ハナコ"), textvariable=val, state='readonly',width=8,height=2) box24.current(0) #初期値を'(index=0)'に設定 box24.grid(row=2,column=1,padx=6,ipady=3) #は行# labe25 = tk.Label(frame12,text=" は行 ",width=4,height=2) labe25.grid(row=2,column=2) val = tk.StringVar() box25 = ttk.Combobox(frame12, values = (" ","畠イチロー","濱ハナコ"), textvariable=val, state='readonly',width=8,height=2) box25.current(0) #初期値を'(index=0)'に設定 box25.grid(row=2,column=3,padx=6,ipady=3) #ま行# labe26 = tk.Label(frame12,text=" ま行 ",width=4,height=2) labe26.grid(row=3,column=0) val = tk.StringVar() box26 = ttk.Combobox(frame12, values = (" ","森山花"), textvariable=val, state='readonly',width=8,height=2) box26.current(0) #初期値を'(index=0)'に設定 box26.grid(row=3,column=1,padx=6,ipady=3) #や行# labe27 = tk.Label(frame12,text=" や行 ",width=4,height=2) labe27.grid(row=3,column=2) val = tk.StringVar() box27 = ttk.Combobox(frame12, values = (" ","加山イチロウ"), textvariable=val, state='readonly',width=8,height=2) box27.current(0) #初期値を'(index=0)'に設定 box27.grid(row=3,column=3,padx=6,ipady=3) root.mainloop() コード

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

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

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

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

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

guest

回答1

0

ベストアンサー

方法としては

  1. ComboBox の操作があった時にイベントを受け取れるように、全てのCommboBoxに対して "<<ComboboxSelected>>" にハンドラをbindする
  2. 上記のイベントハンドラにて
    • 項目が選択された場合、他のComboBoxをdisabledにする
    • 項目の選択が解除された場合は、全てのComboBox を選択可能(readonly) にする

を行えばよいかとおもいます。
以下にとりあえずの処理を書いてみました。(かなりやっつけですが・・。)
もう少しスマートな方法はあるかとおもいますが、とりあえずは動作するかとおもいますので参考にしてください。

Python

1def change_selection(event): 2 cbox_list = [box20, box21, box22, box23, box24, box25, box26, box27] 3 # いずれかのComboboxにて選択されているかをチェック 4 selected = any(b.current() > 0 for b in cbox_list) 5 if not selected: 6 # 選択されていない場合は全てのComboBoxを'readonly'にする 7 for b in cbox_list: 8 b.configure(state='readonly') 9 else: 10 # 選択されている場合は、それ以外のComboBoxを'disabled'にする 11 for b in cbox_list: 12 if b.current() <= 0: 13 b.configure(state='disabled') 14 15box20.bind("<<ComboboxSelected>>", change_selection) 16box21.bind("<<ComboboxSelected>>", change_selection) 17box22.bind("<<ComboboxSelected>>", change_selection) 18box23.bind("<<ComboboxSelected>>", change_selection) 19box24.bind("<<ComboboxSelected>>", change_selection) 20box25.bind("<<ComboboxSelected>>", change_selection) 21box26.bind("<<ComboboxSelected>>", change_selection) 22box27.bind("<<ComboboxSelected>>", change_selection) 23 24root.mainloop()

投稿2017/12/28 02:11

magichan

総合スコア15898

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

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

zono_daiichi

2017/12/28 05:57

有難うございました。お知らせ頂いた通りに実行したら上手くいきました。 今回の問題解決で一気に前に進めそうです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問