Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python GUI上的文本未刷新_Python_Tkinter - Fatal编程技术网

Python GUI上的文本未刷新

Python GUI上的文本未刷新,python,tkinter,Python,Tkinter,这是我第一次尝试编程,所以我是个十足的傻瓜。一切似乎都很好,印刷品就是为了证明这一点。问题是,在打开程序并移动滑块或单击“计算”按钮后,GUI上的值根本没有更新。正如msw所写:您可以使用StringVar 但是要更新回调中的标签,必须为其提供状态 一种常见的模式是将状态封装在类中,如下所示: 另一种方法是将其作为参数显式传递(为了方便起见,这里使用functools.partial) (另一种选择是直接修改全局模块状态,但我认为这不是一种好做法:最好是显式的) 此外,删除了无用的浮点转换,将

这是我第一次尝试编程,所以我是个十足的傻瓜。一切似乎都很好,印刷品就是为了证明这一点。问题是,在打开程序并移动滑块或单击“计算”按钮后,GUI上的值根本没有更新。

正如msw所写:您可以使用StringVar

但是要更新回调中的标签,必须为其提供状态

一种常见的模式是将状态封装在类中,如下所示:

另一种方法是将其作为参数显式传递(为了方便起见,这里使用functools.partial)

(另一种选择是直接修改全局模块状态,但我认为这不是一种好做法:最好是显式的)

此外,删除了无用的浮点转换,将命名样式更改为更符合pep8,并删除了*import(尽管现在应该更好地显式访问Tkinter属性,因为我们要导入这么多属性)

您不必使用StringVar来更改标签的文本(当然可以,但在Tkinter程序中这是一种非常少见的模式)。小部件的
text
选项可以通过
config
方法或使用键
“text”
进行更改,这更容易:

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()
因此,可以更新标签的文本,而无需为每个标签使用StringVar:

label.config(text="new text")
# or
label["text"] = "new text"
如果要在移动滑块时重新计算标签的值,请在缩放小部件的
命令
选项中使用此功能:

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))

相关的,如果不是一个完整的答案:你应该修复缩进。。。特别是,如果没有第二个块,有两个返回语句是没有意义的
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))
Scale(..., command=lambda v: calc1())