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

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

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

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

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Python

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

Q&A

解決済

1回答

4190閲覧

【Python, SQLite3】cursor.execute()で取得した値が、エントリーを変更した際に結果が変化しません。

JinGoda

総合スコア20

SQLite

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

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Python

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

0グッド

0クリップ

投稿2020/02/13 07:07

編集2020/02/13 09:49

前提・実現したいこと

使用言語:Python 3.8.1
使用データベース:SQLite3 3.30.1

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

下記ソースのうち、main.aname.get()で取得したエントリーの値に対応するA, C, Sの値がprint(self.a), print(self.c), print(self.s)で出力された際に反映されません。

該当のソースコード

Python

1# -*- coding: utf-8 -*- 2 3import tkinter as tk 4import sqlite3 as sql 5import tkinter.ttk as ttk 6 7import main 8 9main 10 11dbpath = "dex.sqlite3" 12conn = sql.connect(dbpath) 13cur = conn.cursor() 14 15class AttackDatabase(): 16 17 def __init__(self, name, a, c, s): 18 19 self.name = name 20 self.a = a 21 self.c = c 22 self.s = s 23 24 def get_info(self): 25 26 cur.execute("SELECT A FROM dex WHERE name = '%s'" % main.aname.get()) 27 A = cur.fetchone() 28 cur.execute("SELECT C FROM dex WHERE name = '%s'" % main.aname.get()) 29 C = cur.fetchone() 30 cur.execute("SELECT S FROM dex WHERE name = '%s'" % main.aname.get()) 31 S = cur.fetchone() 32 33 self.a = A[0] 34 self.c = C[0] 35 self.s = S[0] 36 37 print(self.name.get()) 38 print(self.a) 39 print(self.c) 40 print(self.s) 41 42button = tk.Button(main.win, text = 'print', command = AttackDatabase.get_info) 43button.pack() 44 45main.win.mainloop()

Python

1#main.py 2 3import tkinter as tk 4import tkinter.ttk as ttk 5 6win = tk.Tk() 7win.title('ダメージ計算') 8win.geometry('500x500') 9 10atkframe = tk.Frame(win) 11atkframe.pack(pady = 5) 12 13nameframe = tk.Frame(atkframe) 14nameframe.pack(pady = 5) 15alabel = tk.Label(nameframe, text = "攻撃側 ") 16alabel.pack(side = 'left') 17aname = tk.Entry(nameframe, name = 'aname') 18aname.pack(side = 'left') 19aname.insert(index = 'insert', string = "インテレオン") 20 21lvframe = tk.Frame(atkframe) 22lvframe.pack(pady = 5) 23alvlabel = tk.Label(lvframe, text = "レベル ") 24alvlabel.pack(side = 'left') 25alventry = tk.Entry(lvframe) 26alventry.pack(side = 'left') 27alventry.insert(index = 'insert', string = '50') 28 29idframe = tk.Frame(atkframe) 30idframe.pack(pady = 5) 31aivlabel = tk.Label(idframe, text = "個体値 ") 32aivlabel.pack(side = 'left', ipadx = 5) 33aiventry = tk.Entry(idframe) 34aiventry.pack(side = 'left') 35aiventry.insert(index = 'insert', string = '31') 36 37aevlabel = tk.Label(idframe, text = "努力値 ") 38aevlabel.pack(side = 'left') 39aeventry = tk.Entry(idframe) 40aeventry.pack(side = 'left', ipadx = 5) 41aeventry.insert(index = 'insert', string = '252') 42 43natureframe = tk.Frame(atkframe) 44natureframe.pack(pady = 8) 45anaturelabel = tk.Label(natureframe, text = "性格 ") 46anaturelabel.pack(side = 'left') 47anaturecheck = ttk.Combobox(natureframe, state = 'readonly') 48anaturecheck['values'] = ("", "さみしがり", "いじっぱり", "やんちゃ", "ゆうかん", "ずぶとい", "わんぱく", "のうてんき", "のんき", "ひかえめ", "おっとり", "うっかりや", "れいせい", "おだやか", "おとなしい", "しんちょう", "なまいき", "おくびょう", "せっかち", "ようき", "むじゃき", "てれや", "がんばりや", "すなお", "きまぐれ", "まじめ") 49anaturecheck.current(0) 50anaturecheck.pack(side = 'left')

試したこと

SELECT文周辺の位置を変えるといったことを試しましたが、できませんでした。

追記:以下のコードに変更した場合に、数値は出力され、main.aname.get()をエントリーの変更で反映されましたが、self.a, self.c, self.sの三つについては初期値のまま出力されました。

Python

1import tkinter as tk 2import sqlite3 as sql 3import tkinter.ttk as ttk 4 5import main 6 7main 8 9dbpath = "dex.sqlite3" 10conn = sql.connect(dbpath) 11cur = conn.cursor() 12 13cur.execute("SELECT A FROM dex WHERE name = '%s'" % main.aname.get()) 14A = cur.fetchone() 15cur.execute("SELECT C FROM dex WHERE name = '%s'" % main.aname.get()) 16C = cur.fetchone() 17cur.execute("SELECT S FROM dex WHERE name = '%s'" % main.aname.get()) 18S = cur.fetchone() 19 20 21class AttackDatabase(): 22 23 def __init__(self, name, a, c, s): 24 25 self.name = name 26 self.a = a 27 self.c = c 28 self.s = s 29 30 def get_info(self): 31 32 print(self.name.get()) 33 print(self.a) 34 print(self.c) 35 print(self.s) 36 37ad = AttackDatabase(main.aname, A, C, S) 38 39button = tk.Button(main.win, text = 'print', command = ad.get_info) 40button.pack() 41 42main.win.mainloop() 43 44if __name__ == "__main__": 45 46 main 47 main.win.mainloop()

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

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

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

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

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

quickquip

2020/02/13 07:22

「できません」の中身を
JinGoda

2020/02/13 07:41

エラーメッセージは出なくて、main.aname.get()で出力される名前を変化させてもA, C, Sの数値が変化しないです。
t_obara

2020/02/13 07:48

sqliteからデータの取得がうまくできないということでしょうか?質問のタイトルだと「クラスの項への代入がわかりません」となっていますが、一番の問題は何なのでしょうか?
JinGoda

2020/02/13 07:52

データの取得が一番の問題です。取得したそのデータを代入してprintしたときのミスだったのでタイトルはそういう風にさせてもらいました。
t_obara

2020/02/13 07:55

では、質問は編集できるので、適切な内容に変更された方が回答が得られやすくなると思います。 ちなみに、「main.aname.get()で出力される名前を変化させてもA, C, Sの数値が変化しない」とのことですが、どのようにそれを試したのかもご提示されると良いかと思います。
quickquip

2020/02/13 08:05 編集

> A, C, Sの数値が変化しないです。 それはどういうことですか? どうやって確認しましたか? (print(self.a) print(self.c) print(self.s) のことですか?) 情報は質問に追記しましょう。
quickquip

2020/02/13 08:19 編集

button = tk.Button(main.win, text = 'print', command = AttackDatabase.get_info) はこのままでは動かない(ボタンを押したらエラーになる)ので、「何を確認したのかな」と思いました。 見ているコードと別のコードを実行している可能性や、動かしているコードと別のコードを貼ってしまった可能性もありそう。
quickquip

2020/02/13 09:19

エラーが出ているなら、何も不思議な点はないのですが
guest

回答1

0

ベストアンサー

クラスとインスタンスの区別・使い分けを理解していないと思われます。

AttackDatabase.get_info

これはクラスメソッドで、selfがない・渡されないです。

AttackDatabase(様々な引数).get_info

こうすればインスタンスメソッドで、selfが使えるようになります。

printするだけの関数にしてみました。

py

1import tkinter as tk 2import sqlite3 as sql 3import tkinter.ttk as ttk 4 5import main as gui 6 7dbpath = "dex.sqlite3" 8conn = sql.connect(dbpath) 9cur = conn.cursor() 10 11 12def get_info(): 13 name = gui.aname.get() 14 cur.execute("SELECT A FROM dex WHERE name = '%s'" % name) 15 A = cur.fetchone() 16 cur.execute("SELECT C FROM dex WHERE name = '%s'" % name) 17 C = cur.fetchone() 18 cur.execute("SELECT S FROM dex WHERE name = '%s'" % name) 19 S = cur.fetchone() 20 21 print(name) 22 print(A) 23 print(C) 24 print(S) 25 26 27def main(): 28 button = tk.Button(gui.win, text='print', command=get_info) 29 button.pack() 30 gui.win.mainloop() 31 32if __name__ == "__main__": 33 main()

投稿2020/02/13 08:36

編集2020/02/13 11:17
shiracamus

総合スコア5406

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

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

JinGoda

2020/02/13 09:08

その引数としてはどういったものを入れれば良いのでしょうか? SELECT文で取得したA, C, Sの値を入れたいのですが…
shiracamus

2020/02/13 09:19

__init__メソッドのself引数以外の引数です。
shiracamus

2020/02/13 09:20

なぜクラスにしたのですか? クラスにせずに関数にしてはいかがですか?
JinGoda

2020/02/13 09:38

クラス外で関数を作成、そこの値をボタンで取得してAttackDatabaseの引数とする、といった方がよさそうですか?
shiracamus

2020/02/13 09:53 編集

guボタンが押されたときに呼び出す関数を作って、関数の中でguiの値を読み取り、DBを読み出すなりインスタンスを生成するなりしてはいかがですか?
shiracamus

2020/02/13 11:12

printするだけの関数を追記しておきました。
JinGoda

2020/02/13 11:40

ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問