2015-11-05 38 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