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

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

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

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

Tkinter

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

Q&A

解決済

2回答

1337閲覧

tkinter mySQLで取得したIDと名前の中で名前だけをラベルに表示させたい

tami.py

総合スコア32

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2022/06/06 03:58

tkinterでフォーム画面を作成しています。

mySQLでIDと名前を取得し、コンボボックスで選択できるようにしました。コンボボックスで選択したら、その名前を下段のラベルに表示させて、目視できるようにしてあります。
mySQLに登録するのはIDのみ。コンボボックス・ラベルには名前のみ表示させたいと思っています。
ただ現状は、コンボボックス(ラベルも)にIDと名前の両方が表示されてしまいます。
IDが表示されると見た目が悪いので、何とか名前のみの表示にできないかと苦戦しております。

SQL側の取引区分テーブルには、オートナンバー・取引区分名の2つのカラムがあります。

python3.9.10

1# 取引区分・登録フォーム 2 3import tkinter 4from tkinter import ttk 5from tkinter import Tk, font 6from tkinter import messagebox 7import mysql.connector as mysql 8import datetime 9 10 11root = Tk() 12root.title("取引企業登録フォーム") 13root.geometry("400x350") 14 15 16# mysqlにconnect 17con = mysql.connect( 18 database = 'seisan_system', 19 user = 'root', 20 password = 'mta969696', 21 host = 'localhost', 22 port = '3306', 23 ) 24 25# MYSQLからカラムの取得 26cur = con.cursor() 27sql= "select campany_class_id, campany_class_name from tb_campany_class" 28cur.execute(sql) 29campany_class_rows= cur.fetchall() 30 31# 注1 32# 取引区分の選択した際の下段ラベル表示   33def class_show_selected(event): 34 class_label_2.config(text=class_combobox.get()) 35 36 37 38# 登録ボタンを押した際のテキストを読み取るgetメソッド 39def touroku_sql(): 40 class_id = class_combobox.get() 41 42 43# 注2 44 # SQLを発行してDBへ登録 45 try: 46 cur = con.cursor() 47 cur.execute(""" 48 INSERT INTO tb_campany(campany_class_id) 49 VALUES('{}'); 50 """.format(class_id )) 51 cur.execute("COMMIT;") 52 messagebox.showinfo("メッセージ", "登録しました") 53 # ドメインエラーなどにより登録できなかった場合のエラー処理 54 except: 55 print("エラーにより登録できませんでした") 56 root.destroy() 57 58 59 60# 画面を閉じる関数を与える 61def return_view(): 62 root.destroy() 63 64 65#各種ラベルの設定 66font1 = font.Font(size=10) 67class_label_1 = tkinter.Label(text='取引区分の選択:', font=font1) 68 69 70# 各種エントリー等を入力した際の入力内容確認用ラベル 71class_label_2= tkinter.Label() # 取引区分を選択した際用ラベル 72 73 74#取引区分と会社形態 プルダウンの中身を定義 75class_list =(campany_class_rows) 76class_combobox = ttk.Combobox(values=class_list) 77class_combobox.bind('<<ComboboxSelected>>',class_show_selected,) 78 79 80#各種ラベル等の配置 81class_label_1.place(x=40, y=30) 82class_combobox.place(x=150, y=30) 83 84class_label_2.place(x=20, y=250) 85 86 87# 登録・閉じるボタン作成 88btn_toroku = tkinter.Button( 89 text='登録', width=8, command=touroku_sql) 90btn_end = tkinter.Button( 91 text='閉じる', width=8, command=return_view) 92btn_toroku.place(x=230, y=310) 93btn_end.place(x=310, y=310) 94 95 96root.mainloop() 97

やってみたこと
名前のみを取得すれば、コンボボックスに表示されるのも名前だけにできますが、そうするとmySQLに登録されるのも名前だけになってしまいます。
コンボボックス用にmySQL用とは別に名前を取得して名前だけを表示させるとmySQLに登録する際、何も選択していないことになってしまい登録できませんでした。
ネットで検索しても参考にできそうなものを見つけることができませんでした

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

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

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

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

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

guest

回答2

0

Combobox では、表示データしか持てないので、別途 名前 ⇛ ID の探索が必要になります。

  • 名前 ⇛ ID の逆引き辞書を用意しておいて、選択された名前に対応するIDを参照する
  • SQLを発行して、選択された名前に対応するIDを探索する

但し、仕様上、名前の重複が許されている場合は対応できません。

名前の重複がある場合は、選択された要素の添字を元にIDを参照するか、
表示に別ウィジェットの利用を検討してください。
例えば、ttk.Treeview であれば非表示項目に別項目のデータを含ませることができます。

投稿2022/06/08 11:56

teamikl

総合スコア8664

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

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

tami.py

2022/06/18 02:31 編集

ご回答ありがとうございました。 こちらの返信が遅くなってすみません。 いただいた助言をもとに色々なキーワードで調べたり、コードを書いてみたりしてみましたが、実装できずです。逆引き辞書の作成の仕方がわからずつまづいています。
tami.py

2022/06/18 03:26 編集

誤りだったため削除
tami.py

2022/06/22 03:47 編集

逆引き辞書ではないような気がしますが、実装できましたので、ご報告させてもらいます。
guest

0

自己解決

python

1 2# 取引区分フォーム 3import tkinter 4import tkinter as tk 5from tkinter import ttk 6from tkinter import Tk, font 7from tkinter import messagebox 8import mysql.connector as mysql 9import numpy as np 10 11root = Tk() 12root.title("フォーム") 13root.geometry("400x350") 14 15 16# mysqlにconnect 17con = mysql.connect( 18database = 'seisan_system', 19user = 'root', 20password = 'mta969696', 21host = 'localhost', 22port = '3306', 23) 24 25 26# MYSQLからカラムの取得 27cur = con.cursor() 28sql= "select campany_class_id, campany_class_name from tb_campany_class" 29cur.execute(sql) 30campany_class_rows= cur.fetchall() 31cur.close() 32 33 34#--------- 注 --------------- 35# 取引区分の選択・下段表示 36def class_show_selected(event): 37class_label_2.config(text=class_name_list[class_combobox.current()]) 38 39#------------------------------ 40 41#取引区分 プルダウンの中身を定義 42# campany_class_rowsを列方向に2つに分割→IDリストとNAMEリストへ 43class_id_list, class_name_list = np.split(np.array(campany_class_rows), 2, 1) 44# class_name_lisltはndarrayのためtolist()でリスト型に変換 45class_name_list =(class_name_list.tolist()) 46class_id_list =(class_id_list.tolist()) 47class_combobox = ttk.Combobox(state = "readonly", values=campany_class_rows) 48class_combobox.bind('<<ComboboxSelected>>',class_show_selected,) 49class_combobox.focus_set() 50 51# 登録ボタンを押した際のテキストを読み取るgetメソッド 52def touroku_sql(): 53class_id = class_combobox.get() 54##class_id = class_id_list[class_combobox.current()] 55print( class_id ) 56# MYSQLからカラムの取得 57cur = con.cursor() 58sql= ( "select campany_class_id from tb_campany_class where campany_class_id " ) 59cur.execute(sql) 60class_rows= cur.fetchall() 61print(class_rows) 62cur.close() 63 64if class_id =="": 65raise messagebox.showerror("メッセージ", "取引区分を選択してください") 66 67# SQLを発行してDBへ登録 68try: 69cur = con.cursor() 70cur.execute(""" 71INSERT INTO tb_test(campany_class_id ) 72VALUES('{}' ); 73""".format(class_id )) 74cur.execute("COMMIT;") 75messagebox.showinfo("メッセージ", "登録しました") 76cur.close() 77con.close() 78# ドメインエラーなどにより登録できなかった場合のエラー処理 79except: 80messagebox.showerror("メッセージ", "エラーにより登録できませんでした") 81root.destroy() 82 83 84# 画面を閉じる関数を与える 85def return_view(): 86root.destroy() 87 88 89#各種ラベルの設定 90font1 = font.Font(size=10) 91class_label_1 = tk.Label(text='取引区分の選択:', font=font1) 92class_label_2= tk.Label() # 取引区分を選択した際用ラベル 93 94 95#各種ラベル等の配置 96class_label_1.place(x=40, y=30) 97class_combobox.place(x=150, y=30) 98class_label_2.place(x=20, y=250) 99 100 101btn_toroku = tkinter.Button( 102text='登録', width=8, command=touroku_sql) 103btn_toroku.place(x=230, y=310) 104# 閉じるボタン作成 105btn_end = tkinter.Button( 106text='閉じる', width=8, command=return_view) 107btn_end.place(x=310, y=310) 108 109 110 111root.mainloop() 112

投稿2022/06/22 03:48

tami.py

総合スコア32

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問