Python TKInter如何替换框架中的数据?

时间:2015-11-05 05:25:00

标签: python tkinter

我的代码存在以下主要问题。所以这就是我想要做的。

用户在输入字段中输入某些输入,程序会计算并显示相应的图像(加载在框架champFrame中)及其描述(在spellFrame中)。

我想要的是每次点击Calculate!按钮时替换此图像和文本,以便根据我的新输入向我显示新图像和新描述。 但是,在当前状态下,当我输入新输入并单击Calculate!按钮时,它只会将旧图像添加到旧图像下方,旧图像仍然存在。

如何更改我的代码以便我可以替换这些旧值? 我听说过使用pack_forget()方法,但它只隐藏了上一张图片,没有将其删除,所以我可以用新版本替换它。

from Tkinter import *
from PIL import ImageTk
from Calculation import getHighestScore
from ImageHandler import *
import json
import urllib2

top = Tk()
top.title("LOLSpellEfficiency")
top.geometry("600x600")

def loadInputFields(frame):
    AP_Label = Label(frame, text="AP")
    AD_Label = Label(frame, text="AD")
    CDR_Label = Label(frame, text="CDR")

    AP_Label.grid(row=0, column=0)
    AD_Label.grid(row=1, column=0)
    CDR_Label.grid(row=2, column=0)

    AP_Entry = Entry(frame)

    AD_Entry = Entry(frame)

    CDR_Entry = Entry(frame)

    AP_Entry.grid(row=0, column=1)
    AP_Entry.insert(0, "0")
    AD_Entry.grid(row=1, column=1)
    AD_Entry.insert(0, "0")
    CDR_Entry.grid(row=2, column=1)
    CDR_Entry.insert(0, "0")

    return [AP_Entry, AD_Entry, CDR_Entry]


def loadButton(frame, entries):
    Enter_Button = Button(frame, text="Calculate!", command = lambda: executeProgram(entries))
    Enter_Button.pack(side=TOP)

def executeProgram(entries):

    AP = float(entries[0].get())
    AD = float(entries[1].get())
    CDR = float(entries[2].get())
    data = getChampionData()
    result = getHighestScore(data, AP, AD, CDR)

    champPhoto = ImageTk.PhotoImage(getChampionImage(result[0]))
    champLabel = Label(championFrame, image=champPhoto)
    champLabel.image = champPhoto
    champLabel.pack(side = TOP)

    champName = Label(championFrame, text = "Champion: " + result[0])
    champName.pack(side = BOTTOM)

    spellPhoto = ImageTk.PhotoImage(getSpellImage(result[2]))
    spellLabel = Label(spellFrame, image=spellPhoto)
    spellLabel.image = spellPhoto


    spellText = Text(spellFrame, wrap=WORD)
    spellText.insert(INSERT, "Spell: " + result[1] + "\n")
    spellText.insert(INSERT, "Spell description: " + result[3] + "\n")
    spellLabel.pack(side=TOP)
    spellText.pack(side=BOTTOM)

    championFrame.pack()
    spellFrame.pack()


def getChampionData():
    URL = "https://global.api.pvp.net/api/lol/static-data/na/v1.2/champion?champData=all&api_key=8e8904b4-c112-4b0f-bd1e-641649d9e569"
    return json.load(urllib2.urlopen(URL))


inputFrame = Frame(top)
inputFrame.pack()

buttonFrame = Frame(top)
buttonFrame.pack()

championFrame = Frame(top)
spellFrame = Frame(top)
championFrame.pack()
spellFrame.pack()

entries = loadInputFields(inputFrame)
loadButton(buttonFrame, entries)

top.mainloop()

1 个答案:

答案 0 :(得分:0)

不要在executeProgram内创建小部件。相反,在主应用程序中创建它们,只需更改executeProgram内的小部件。

所有小部件都有configure方法,可让您更改该小部件的所有属性。例如,要更改标签上的图像,您可以执行以下操作:

champPhoto = ImageTk.PhotoImage(getChampionImage(result[0]))
champLabel.configure(image=champPhoto)
champLabel.image = champPhoto