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

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

ただいまの
回答率

89.63%

【Python】tk.Entry()から取得した内容が反映されません。

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 90

JinGoda

score 6

前提・実現したいこと

何度も質問失礼します。
下記のdamagecalculation.pyを実行した際に、cursor.pyでmain.aname.get()で取得したH, A, B, C, Dの値を利用して計算したいと思っています(今はH, A, Bの三つを使ってテストしています)。
これを実行した際に取得はできているのですが、main.anameの文字列とmain.dnameの文字列を入れ替えた際に取得する値(H, A, B)が入れ替え前と全く同じになっており、最初に取得したものに固定されているようです。

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

エラーメッセージは出ませんが、攻撃側と防御側の入れ替わった値が得られず、計算がうまくいきません。

該当のソースコード

#calculation.py
def calc():

    import cursor
    import field
    import pokemon
    import revs

    cur.execute("SELECT type FROM moves WHERE name = '%s'" % main.mname.get())
    mtype = cur.fetchone()
    cur.execute("SELECT rev FROM types WHERE type1 = '%s' AND type2 = '%s'" % (mtype[0], cursor.dt1[0]))
    rev1 = cur.fetchone()
    cur.execute("SELECT rev FROM types WHERE type1 = '%s' AND type2 = '%s'"% (mtype[0], cursor.dt2[0]))
    rev2 = cur.fetchone()
    cur.execute("SELECT power FROM moves WHERE name = '%s'" % main.mname.get())
    mpower = cur.fetchone()
    cur.execute("SELECT a FROM nature WHERE nature = '%s'" % main.anaturecheck.get())
    na = cur.fetchone()
    cur.execute("SELECT b FROM nature WHERE nature = '%s'" % main.dnaturecheck.get())
    nb = cur.fetchone()
    cur.execute("SELECT c FROM nature WHERE nature = '%s'" % main.anaturecheck.get())
    nc = cur.fetchone()
    cur.execute("SELECT d FROM nature WHERE nature = '%s'" % main.dnaturecheck.get())
    nd = cur.fetchone()
    typecomp = rev1[0] * rev2[0]

    H = int(int(pokemon.dp.H * 2 + int(pokemon.dp.iv) + int(pokemon.dp.ev) / 4) * int(pokemon.dp.lv) / 100 + int(pokemon.dp.lv) + 10)
    A = int(int(int(pokemon.ap.A * 2 + int(pokemon.ap.iv) + int(pokemon.ap.ev) / 4) * int(pokemon.ap.lv) / 100 + 5) * na[0])
    B = int(int(int(pokemon.dp.B * 2 + int(pokemon.dp.iv) + int(pokemon.dp.ev) / 4) * int(pokemon.dp.lv) / 100 + 5) * nb[0])
    C = int(int(int(pokemon.ap.C * 2 + int(pokemon.ap.iv) + int(pokemon.ap.ev) / 4) * int(pokemon.ap.lv) / 100 + 5) * nc[0])
    D = int(int(int(pokemon.dp.D * 2 + int(pokemon.ap.iv) + int(pokemon.ap.ev) / 4) * int(pokemon.ap.lv) / 100 + 5) * nd[0])

    if cursor.mmtype[0] == 'A':

        f = math.floor(math.floor(math.floor(int(pokemon.ap.lv) * 2 / 5 + 2) * mpower[0] * A / B) / 50 + 2) * revs.ran()
        s = str(f)
        a, b = s.split('.')

        if int(b) > 5:

            c = math.ceil(f)

        else:

            c = math.floor(f)

        f2 = c * field.rain()
        s2 = str(f2)
        a2, b2 = s2.split('.')

        if int(b2) > 5:

            d = math.ceil(f2)

        else:

            d = math.floor(f2)

        f3 = d * field.sun()
        s3 = str(f3)
        a3, b3 = s3.split('.')

        if int(b3) > 5:

            e = math.ceil(f3)

        else:

            e = math.floor(f3)

        f4 = e * revs.critical()
        s4 = str(f4)
        a4, b4 = s4.split('.')

        if int(b4) > 5:

            g = math.ceil(f4)

        else:

            g = math.floor(f4)

        f5 = g * 85 / 100
        f6 = g * 100/ 100
        h1 = math.floor(f5)
        h2 = math.floor(f6)

        f7 = h1 * revs.match()
        f8 = h2 * revs.match()
        s5 = str(f7)
        s6 = str(f8)
        a5, b5 = s5.split('.')
        a6, b6 = s6.split('.')

        if int(b5) > 5:

            i1 = math.ceil(f7)

        else:

            i1 = math.floor(f7)

        if int(b6) > 5:

            i2 = math.ceil(f8)

        else:

            i2 = math.floor(f8)

        f9 = i1 * typecomp
        f10 = i2 * typecomp
        j1 = math.floor(f9)
        j2 = math.floor(f10)

        f11 = j1 * revs.burn()
        f12 = j2 * revs.burn()
        s7 = str(f11)
        s8 = str(f12)
        a7, b7 = s7.split('.')
        a8, b8 = s8.split('.')

        if int(b7) > 5:

            k1 = math.ceil(f11)

        else:

            k1 = math.floor(f11)

        if int(b8) > 5:

            k2 = math.ceil(f12)

        else:

            k2 = math.floor(f12)

        dmg = k1

        Dmg = k2

        if dmg == 0:

            dmg = 1

        if Dmg == 0:

            dmg = 1

        hpleft = H - dmg
        HPleft = H - Dmg

        if H % Dmg >= dmg and H % Dmg < Dmg:

            per = (Dmg - (H % dmg)) / (Dmg - dmg)
            print('乱数' + str(H // dmg))
            print(per + '%')

        elif H % dmg < dmg:

            print ('確定' + str(H // dmg + 1))

        else:

            print('error')

        print(str(int(dmg)) + '~' + str(int(Dmg)))
        print(typecomp)
        print(H)
        print(B)
        print(hpleft)
        print(HPleft)
#pokemon.py
class AttackingPokemon:

    def __init__(self, name, type1, type2, lv, iv, ev, nature, A, C, S):

        self.name = name.get()
        self.type1 = type1
        self.type2 = type2
        self.lv = lv.get()
        self.iv = iv.get()
        self.ev = ev.get()
        self.nature = nature.get()
        self.A = A
        self.C = C
        self.S = S

class DefendingPokemon:

    def __init__(self, name, type1, type2, lv, iv, ev, nature, H, B, D, S):

        self.name = name.get()
        self.type1 = type1
        self.type2 = type2
        self.lv = lv.get()
        self.iv = iv.get()
        self.ev = ev.get()
        self.nature = nature.get()
        self.H = H
        self.B = B
        self.D = D
        self.S = S

ap = AttackingPokemon(main.aname, cursor.at1[0], cursor.at2[0], main.alventry, main.aiventry, main.aeventry, main.anaturecheck, cursor.A[0], cursor.C[0], cursor.aS[0])
dp = DefendingPokemon(main.dname, cursor.dt1[0], cursor.dt2[0], main.dlventry, main.diventry, main.deventry, main.dnaturecheck, cursor.H[0], cursor.B[0], cursor.D[0], cursor.dS[0])
#cursor.py
dbpath = "dex.sqlite3"
conn = sql.connect(dbpath)
cur = conn.cursor()

cur.execute("SELECT type1 FROM dex WHERE name = '%s'" % main.aname.get())
at1 = cur.fetchone()
cur.execute("SELECT type2 FROM dex WHERE name = '%s'" % main.aname.get())
at2 = cur.fetchone()

cur.execute("SELECT S FROM dex WHERE name = '%s'" % main.aname.get())
aS = cur.fetchone()

cur.execute("SELECT type1 FROM dex WHERE name = '%s'" % main.dname.get())
dt1 = cur.fetchone()
cur.execute("SELECT type2 FROM dex WHERE name = '%s'" % main.aname.get())
dt2 = cur.fetchone()
cur.execute("SELECT H FROM dex WHERE name = '%s'" % main.dname.get())
H = cur.fetchone()
cur.execute("SELECT B FROM dex WHERE name = '%s'" % main.dname.get())
B = cur.fetchone()
cur.execute("SELECT D FROM dex WHERE name = '%s'" % main.dname.get())
D = cur.fetchone()
cur.execute("SELECT A FROM dex WHERE name = '%s'" % main.aname.get())
A = cur.fetchone()
cur.execute("SELECT C FROM dex WHERE name = '%s'" % main.aname.get())
C = cur.fetchone()

cur.execute("SELECT S FROM dex WHERE name = '%s'" % main.dname.get())
dS = cur.fetchone()
cur.execute("SELECT mtype FROM moves WHERE name = '%s'" % main.mname.get())
mmtype = cur.fetchone()
cur.execute("SELECT type FROM moves WHERE name = '%s'" % main.mname.get())
mtype = cur.fetchone()
#main.py
import tkinter as tk
import tkinter.ttk as ttk

win = tk.Tk()
win.title('ダメージ計算')
win.geometry('600x600')

atkframe = tk.Frame(win)
atkframe.pack(pady = 5)

nameframe = tk.Frame(atkframe)
nameframe.pack(pady = 5)
alabel = tk.Label(nameframe, text = "攻撃側 ")
alabel.pack(side = 'left')
aname = tk.Entry(nameframe, name = 'aname')
aname.pack(side = 'left')
aname.insert(index = 'insert', string = "インテレオン")

lvframe = tk.Frame(atkframe)
lvframe.pack(pady = 5)
alvlabel = tk.Label(lvframe, text = "レベル ")
alvlabel.pack(side = 'left')
alventry = tk.Entry(lvframe)
alventry.pack(side = 'left')
alventry.insert(index = 'insert', string = '50')

idframe = tk.Frame(atkframe)
idframe.pack(pady = 5)
aivlabel = tk.Label(idframe, text = "個体値 ")
aivlabel.pack(side = 'left', ipadx = 5)
aiventry = tk.Entry(idframe)
aiventry.pack(side = 'left')
aiventry.insert(index = 'insert', string = '31')

aevlabel = tk.Label(idframe, text = "努力値 ")
aevlabel.pack(side = 'left')
aeventry = tk.Entry(idframe)
aeventry.pack(side = 'left', ipadx = 5)
aeventry.insert(index = 'insert', string = '252')

natureframe = tk.Frame(atkframe)
natureframe.pack(pady = 8)
anaturelabel = tk.Label(natureframe, text = "性格 ")
anaturelabel.pack(side = 'left')
anaturecheck = ttk.Combobox(natureframe, state = 'readonly')
anaturecheck['values'] = ("", "さみしがり", "いじっぱり", "やんちゃ", "ゆうかん", "ずぶとい", "わんぱく", "のうてんき", "のんき", "ひかえめ", "おっとり", "うっかりや", "れいせい", "おだやか", "おとなしい", "しんちょう", "なまいき", "おくびょう", "せっかち", "ようき", "むじゃき", "てれや", "がんばりや", "すなお", "きまぐれ", "まじめ")
anaturecheck.current(2)
anaturecheck.pack(side = 'left')

moveframe = tk.Frame(atkframe)
moveframe.pack()
mlabel = tk.Label(moveframe, text = "わざ名 ")
mlabel.pack()
mname = tk.Entry(moveframe)
mname.pack()
mname.insert(index = 'insert', string = "アクアジェット")
#damagecalculation.py
import tkinter as tk
import tkinter.ttk as ttk
import sqlite3 as sql

import main
import calculation

calc = tk.Button(main.win, text = '結果', command = calculation.calc)
calc.pack()

main.win.mainloop()

試したこと

関連している部分の位置を変える、def calc()内に入れる等してみましたができませんでした。
以前にも同様の質問をしたため、それも参考にbuttonの実行している関数内に入れるのかと思ったのですが...

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

使用言語:Python 3.8.1

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

importは1回しか実行されません。2回目以降は無視して何も実行しません。
cursor.py などで直接処理を書いてあるのをすべて関数化し、calculation.pyからはそれらの関数を呼び出すようにすることで、毎回新しい値を取得できます。
関数やクラスやメソッドで必要な情報は、main処理から引数で渡してください。
引数が多くなるようなら、情報をまとめたオブジェクト(クラスのインスタンス)を渡すといいです。

import は関数の中に書かず、ファイルの先頭に書きましょう。
参考: https://pep8-ja.readthedocs.io/ja/latest/

import文 は常にファイルの先頭、つまり モジュールコメントや docstring の直後、そしてモジュールのグローバル変数や定数定義の前に置くようにします。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる