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

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

新規登録して質問してみよう
ただいま回答率
85.48%
データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Python

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

Q&A

解決済

1回答

1520閲覧

【パイソン】計算式に変数が使えず困っています

JinGoda

総合スコア20

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Python

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

0グッド

0クリップ

投稿2020/01/25 13:17

編集2020/01/25 13:34

前提・実現したいこと

使用バージョン:Python 3.8.1, sqlite3 3.30.1

ゲームのダメージ計算機をパイソンの中で作成したく思い、作ろうとしています。
この中で実際にダメージを計算する部分を作っています。

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

変数を使って計算式を使った際に型の違うものを計算している旨のエラーが出ます。

Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\gojin\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line 1883, in __call__ return self.func(*args) File "C:\Users\gojin\Desktop\sqlite3\damagecalculation.py", line 84, in click dmg = int(int(22 * power * Atktype / Deftype) / 50 +2) * range_rev * mAtk TypeError: unsupported operand type(s) for *: 'int' and 'sqlite3.Cursor'

該当のソースコード

初心者のためかなり長いコードであり、どこを変えるのがいいのかがわからなかったのですべて載せることをお許しください。

Python

1import tkinter as tk 2import sqlite3 as sql 3 4dbpath = 'dex.sqlite3' 5conn = sql.connect(dbpath) 6cur = conn.cursor() 7 8win = tk.Tk() 9win.title('ダメージ計算') 10win.geometry('500x350') 11 12l1 = tk.Label(text = '攻撃側ポケモン名') 13l1.pack() 14a = tk.Entry() 15a.pack() 16a.insert(index = 'insert', string = '') 17 18l2 = tk.Label(text = 'わざ名') 19l2.pack() 20b = tk.Entry() 21b.pack() 22b.insert(index = 'insert', string = '') 23 24l3 = tk.Label(text = '防御側ポケモン名') 25l3.pack() 26c = tk.Entry() 27c.pack() 28c.insert(index = 'insert', string = '') 29 30def click(): 31 32 A = a.get() 33 B = b.get() 34 C = c.get() 35 36 Atk = cur.execute("SELECT A FROM dex WHERE Name = '%s'" % A) 37 SpA = cur.execute("SELECT C FROM dex WHERE Name = '%s'" % A) 38 type1 = cur.execute("SELECT type1 FROM dex WHERE Name = '%s'" % A) 39 type2 = cur.execute("SELECT type2 FROM dex WHERE Name = '%s'" % A) 40 mtype = cur.execute("SELECT type FROM moves WHERE name = '%s'" % B) 41 Def = cur.execute("SELECT B FROM dex WHERE Name = '%s'" % C) 42 SpD = cur.execute("SELECT D FROM dex WHERE Name = '%s'" % C) 43 power = cur.execute("SELECT power FROM moves WHERE name = '%s'" % B) 44 mAtktype = cur.execute("SELECT mtype FROM moves WHERE name = '%s'" % B) 45 46 if type1 == mtype: 47 48 mAtk = 1.5 49 50 if type2 == mtype: 51 52 mAtk = 1.5 53 54 else: 55 56 mAtk = 1.0 57 58 if mAtktype == A: 59 60 Atktype = int(Atk) 61 62 if mAtktype == C: 63 64 Atktype = int(SpA) 65 66 if mAtktype == A: 67 68 Deftype = int(Def) 69 70 if mAtktype == C: 71 72 Deftype = int(SpD) 73 74 bin = tk.BooleanVar() 75 76 if bin.get(): 77 78 range_rev = 0.75 79 80 else: 81 82 range_rev = 1 83 84 dmg = int(int(22 * power * Atktype / Deftype) / 50 +2) * range_rev * mAtk 85 86 print(dmg) 87 88check = tk.Checkbutton(win, variable = bin, text = '範囲補正') 89check.pack() 90 91onButton = tk.Button(win, text = 'Calculate', command = click) 92onButton.pack() 93 94win.mainloop()

試したこと

Power = int(power)のように無理やりint型に変えようとしましたが、cursor型はint型に変換できないとのエラーが出ました。

補足情報(FW/ツールのバージョンなど)

SELECT文にて読みだしている情報はintegerとしてデータベースに格納されていますので、そこにミスはないのではないかと思っております。

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

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

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

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

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

y_waiwai

2020/01/25 13:28

エラーメッセージは、出たものをそのまま全部コピペして提示しましょう。 肝心なものを省略されては解決できませんぜ
JinGoda

2020/01/25 13:35

変更いたしました、すみません。
JinGoda

2020/01/25 14:50

初歩的なミスでした...ありがとうございます!
guest

回答1

0

ベストアンサー

power = cur.execute(~ではなく

Python

1cur.execute() 2power = cur.fetchone()

として結果を取得してください。
また、結果はタプルとして返るのでpower[0]として実際の値を得てください。

Python

1 2import sqlite3 3 4# テストデータ作成 5con = sqlite3.connect('test.db') 6cur = con.cursor() 7cur.execute('drop table if exists moves;') 8cur.execute('create table if not exists moves(power int, name text);') 9cur.executemany("insert into moves(power, name) values(?,?)",[(1,'a'),(2,'b')]) 10con.commit() 11con.close() 12 13con = sqlite3.connect('test.db') 14con.row_factory = sqlite3.Row# 属性名で値を取り出せるように 15cur = con.cursor() 16 17# × 18power = cur.execute("select power from moves where name='a';") 19print(power) # <sqlite3.Cursor object at 0x000001741A5A5AB0> 20#print( power + 1) # TypeError: unsupported operand type(s) for +: 'sqlite3.Cursor' and 'int' 21 22# ○ 23cur.execute("select power from moves where name='a';") 24power = cur.fetchone() 25print(power) # (1,) 26print(power[0] + 1) # 2 27 28# これでも可 29cur.execute("select power from moves where name='a';") 30power = cur.fetchone() 31print(power) # <sqlite3.Row object at 0x000001B0541DAEF0> 32print(power['power'] + 1) # 2

投稿2020/01/25 14:15

can110

総合スコア38266

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

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

JinGoda

2020/01/25 14:49 編集

エラーが解消されました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問