1
from Tkinter import *

root = Tk()

armor = Label(root, text="Armor:", font=("Helvetica", 12))
armor.grid(row=1, column=0)
armorscale = Scale(root, from_=1337, to=20000, orient=HORIZONTAL, length=500)
armorscale.grid(row=1, column=1)
###
damage = Label(root, text="Base Damage:", font=("Helvetica", 12), justify=LEFT)
damage.grid(row=2, column=0)
damagescale = Scale(root, from_=100, to=2000, orient=HORIZONTAL, length=500)
damagescale.grid(row=2, column=1)
###    
armorfloat = float(armorscale.get())
damagefloat = float(damagescale.get())
fReduction = float(armorfloat / (armorfloat + 12 * damagefloat))
sReduction = str(fReduction)
fTaken = damagefloat * (1 - (1* fReduction))
sTaken = str(fTaken)
###
def calc1():
    armorfloat = float(armorscale.get())
    damagefloat = float(damagescale.get())
    fReduction = float(armorfloat / (armorfloat + 12 * damagefloat))
    sReduction = str(fReduction)
    fTaken = damagefloat * (1 - (1 * fReduction))
    sTaken = str(fTaken)
    print sReduction
    print sTaken
    return sReduction
    return sTaken

###
reduction = Label(root, text="Reduction %:" + sReduction, font=("Helvetica", 12), justify=LEFT)
reduction.grid(row=3, column=0)
taken = Label(root, text="Damage Taken:" + sTaken, font=("Helvetica", 12), justify=LEFT)
taken.grid(row=4, column=0)
button = Button(root, text="Calculate", command=calc1)
button.grid(row=3, column=1, pady=5, sticky=E)
###
root.mainloop()

何かをプログラミングしようとするのはこれが初めてなので、まったく初心者です。すべてが正常に機能しているようで、印刷物はそれを証明するためだけにあります. 問題は、プログラムを開いてスライダーを動かした後、または計算ボタンをクリックしたときに、GUI の値がまったく更新されないことです。

4

2 に答える 2

3

ラベルのテキストを変更するために StringVarを使用する必要はありません(もちろん変更できますが、Tkinter プログラムでは非常に珍しいパターンです)。textウィジェットのオプションは、configメソッドまたはキーを使用して変更できます"text"。これははるかに簡単です。

label.config(text="new text")
# or
label["text"] = "new text"

したがって、各ラベルに StringVar を使用しなくても、ラベルのテキストを更新できます。

def calc1():
    armorfloat = float(armorscale.get())
    damagefloat = float(damagescale.get())
    fReduction = float(armorfloat / (armorfloat + 12 * damagefloat))
    fTaken = damagefloat * (1 - (1 * fReduction))
    reduction.config(text="Reduction %:{}".format(fReduction))
    taken.config(text="Damage Taken:{}".format(fTaken))

スライダーを動かしたときにもラベルの値を再計算したい場合commandは、スケール ウィジェットのオプションでこの関数を使用します。

Scale(..., command=lambda v: calc1())
于 2013-04-11T12:04:45.487 に答える
0

msw が書いたように: StringVar を使用できます

ただし、コールバック内のラベルを更新するには、状態を指定する必要があります

一般的なパターンは、この回答のようにクラス内に状態をカプセル化することです: How to update image in tkinter label?

別の方法として、引数として明示的に渡すこともできます (ここでは、便宜上 functools.partial を使用しています)。

(別の方法として、グローバル モジュールの状態を直接変更することもできますが、それは適切な方法ではないと思います。明示的に記述したほうがよいでしょう)

また、役に立たない float 変換を削除し、命名スタイルをもう少し pep8 に準拠するように変更し、* インポートを削除しました (ただし、Tkinter 属性の多くをインポートしているため、Tkinter 属性に明示的にアクセスする方がよいはずです)。

from Tkinter import Tk, Label, Scale, HORIZONTAL, LEFT, StringVar, Button, E
from functools import partial

root = Tk()

armorlabel = Label(root, text="Armor:", font=("Helvetica", 12))
armorlabel.grid(row=1, column=0)
armorscale = Scale(root, from_=1337, to=20000, orient=HORIZONTAL, length=500)
armorscale.grid(row=1, column=1)
###
damagelabel = Label(root, text="Base Damage:", font=("Helvetica", 12), justify=LEFT)
damagelabel.grid(row=2, column=0)
damagescale = Scale(root, from_=100, to=2000, orient=HORIZONTAL, length=500)
damagescale.grid(row=2, column=1)
###    
damage_reduction = StringVar()
damage_taken = StringVar()


def calc1(reduction, taken):
    armor = armorscale.get()
    damage = damagescale.get()
    reduction_value = armor / (armor + 12.0 * damage)
    reduction.set("Reduction %%: %s" % reduction_value)
    taken_value = damage * (1 - reduction_value)
    taken.set("Damage Taken: %s" % taken_value)

###
reduction_label = Label(root, textvariable=damage_reduction, font=("Helvetica", 12), justify=LEFT)
reduction_label.grid(row=3, column=0)
taken_label = Label(root, textvariable=damage_taken, font=("Helvetica", 12), justify=LEFT)
taken_label.grid(row=4, column=0)
calc = partial(calc1, damage_reduction, damage_taken)
button = Button(root, text="Calculate", command=calc)
button.grid(row=3, column=1, pady=5, sticky=E)
calc()
###
root.mainloop()
于 2013-04-11T11:46:16.787 に答える