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

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

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

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

Q&A

解決済

1回答

1127閲覧

テキストボックスに入力した値を取得して登録

MATLIB

総合スコア27

Python 3.x

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

0グッド

0クリップ

投稿2020/10/02 13:24

編集2020/10/04 23:47

テキストボックスに入力した値をDBに登録したいです。
使用しているDBはPostgreSQLです。

エラー内容は下記になります。
AttributeError: '_tkinter.tkapp' object has no attribute 'txt1'

この画面をクラスにする前は登録できていたのですが、
画面をクラスにしてみたら登録できなくなりました。
画面やコントロールは問題なく表示されています。

def create_sql(self):
id = self.master.txt1.get()
name = self.master.txt2.get()
kana = self.master.txt3.get()
上記でテキストボックスの値が取れていないのが原因だと思うのですが、改善できません。
id = self.master.txt1.get()書き方が間違っていると思いますが、、、

def create_widgets(self):の
txt1,txt2,txt3の値を上記で受け取れる方法を教えて下さい。
また、おかしなところがあれば教えてください。

import tkinter import tkinter as tk from tkinter import font from tkinter import messagebox import psycopg2 # connect postgreSQL conn = psycopg2.connect(必要な情報) class toroku(tkinter.Frame): def __init__(self,master): super().__init__(master) self.pack() self.master.geometry("800x480") self.master.title("AAA") self.create_widgets() # 最初の画面に戻る def return_view(self): self.master.destroy() def create_sql(self): # Entryウィジェットのテキストを読み取るgetメソッド id = self.master.txt1.get() name = self.master.txt2.get() kana = self.master.txt3.get() # SQLを発行してDBへ登録 try: cur = conn.cursor() cur.execute(""" INSERT INTO gs_sys(id,name,kana) VALUES('{}','{}','{}'); """.format(id, name, kana)) cur.execute("COMMIT;") messagebox.showinfo("メッセージ", "1件の情報を登録しました") print("1件登録しました") # ドメインエラーなどにより登録できなかった場合のエラー処理 except: print("エラーにより登録できませんでした") # Create Widgets function def create_widgets(self): # ラベル作成 font1 = font.Font(self.master, size=10) LBL_1 = tkinter.Label(self.master, text='ID:', font=font1) LBL_1.place(x=40, y=30) # ラベルを配置する位置の設定 LBL_2 = tkinter.Label(self.master, text='名:', font=font1) LBL_2.place(x=40, y=70) # ラベルを配置する位置の設定 LBL_3 = tkinter.Label(self.master, text='よみ:', font=font1) LBL_3.place(x=40, y=110) # ラベルを配置する位置の設定 # テキストボックス txt1 = tkinter.Entry(self.master, width=30) # ID txt1.place(x=140, y=30) txt2 = tkinter.Entry(self.master, width=30) # 名 txt2.place(x=140, y=70) txt3 = tkinter.Entry(self.master, width=30) # 名(よみ) txt3.place(x=140, y=110) # ボタン作成 toroku_btn = tkinter.Button(self.master, text='登録', width=8, command=self.create_sql) # ボタン設定(text=ボタンに表示するテキスト) toroku_btn.place(x=630, y=440) # ボタンを配置する位置の設定 btn_end = tkinter.Button(self.master, text='閉じる', width=8, command=self.return_view) # ボタン設定(text=ボタンに表示するテキスト) btn_end.place(x=710, y=440) def main(): root = tk.Tk() app = toroku(master=root) app.mainloop() if __name__ == "__main__": main()

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問とコードをみるに、create_widgetsで作成したtxt1,txt2,txt3を別のcreate_sqlで扱おうとしているようです。

しかし、ウィジェットの作成/アクセス方法が

  • create_widgets: txt1
  • create_sql: self.master.txt1

となっており、create_widgetsで作成したウィジェットには他メソッドでは扱えません。
self.master経由で他メソッドから扱う意思がある以上は、ウィジェット作成時からそうする必要があります。

diff

1- txt1 = tkinter.Entry(self.master, width=30) # ID 2- txt1.place(x=140, y=30) 3- txt2 = tkinter.Entry(self.master, width=30) # 名 4- txt2.place(x=140, y=70) 5- txt3 = tkinter.Entry(self.master, width=30) # 名(よみ) 6- txt3.place(x=140, y=110) 7+ self.master.txt1 = tkinter.Entry(self.master, width=30) # ID 8+ self.master.txt1.place(x=140, y=30) 9+ self.master.txt2 = tkinter.Entry(self.master, width=30) # 名 10+ self.master.txt2.place(x=140, y=70) 11+ self.master.txt3 = tkinter.Entry(self.master, width=30) # 名(よみ) 12+ self.master.txt3.place(x=140, y=110)

投稿2020/10/05 00:10

attakei

総合スコア2740

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

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

MATLIB

2020/10/05 01:24

ありがとうございます。 解決しました。 self.master経由の時は、self.master.txt1= にしなければいけないのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問