2015-11-05 83 views
0

我在下面的代码中遇到了一个主要问题。所以这就是我想要做的。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() 
+0

我没有用在Tkinter的图像,但'.configure()'不是图像的选择吗? –

+0

我有一段时间没有使用tkinter,所以这可能是错误的,但不能只是调用label ['image'] = new_image,然后调用top.update()更新框架以在单击按钮时显示更改 – Pythonista

回答

0

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

所有小部件都有一个configure方法,它允许您更改该小部件的所有属性。例如,要更改标签,你会做这样的事情上的图像:

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