2014-03-30 45 views
0

我正在製作一個程序,爲您提供有關星球/星星的信息和圖片。我正在使用tkinter來這樣做。Python - Tkinter與標籤和照片

這裏是一個問題就出現了各地代碼:

sunPic = r'sun.gif' 
mercPic = r'merc.gif' 


buttonFrame = Frame(root) 
buttonFrame.pack(side=LEFT) 

textFrame = Frame(root) 
textFrame.pack(side=TOP) 


def sunInfo(): 

    sunImage = PhotoImage(file=sunPic) 
    img1 = Label(textFrame, image = sunImage) 
    img1.image = sunImage 
    img1.pack() 


def mercInfo(): 

    mercImage = PhotoImage(file=mercPic) 
    img1.configure(image = mercImage) 
    img1.image = mercImage 
    img1.pack() 

sun = Button(buttonFrame, text="THE SUN",command=sunInfo) 
sun.pack(side=TOP) 

mercury = Button(buttonFrame, text="MERCURY",command=mercInfo) 
mercury.pack(side=TOP) 

當你按下一個按鈕,它應該改變圖像。所以說如果我按下「太陽」按鈕,會出現一張太陽照片,然後我按下MERCURY按鈕,水銀圖片將取代太陽圖片。

但這並不奏效。當我點擊該按鈕,汞談到了這個錯誤:

img1.configure(image = mercImage) 
NameError: global name 'img1' is not defined 

另外,如果我按SUN幾次按鈕,太陽的幾個圖像顯示出來!我不想要這個。

我想做的事,這個方案做:

  • 創建與行星名稱按鈕。

  • 允許用戶按了按鈕

  • 的圖片,在該行星的一些信息顯示

  • 如果用戶按下另一個按鈕,圖像和信息是由新行星的信息取代和圖片。

這是我今晚需要完成的一個項目。我有一點tkinter的經驗,我需要幫助。

謝謝。

ALSO:

這裏是我工作的全部代碼:

from tkinter import * 

root = Tk() 



root.geometry('1024x768+200+200') # makes window (x,y+top left corner right + top left corner down) 
root.title("Planetary Information") # creates title for window 

sunPic = r'sun.gif' 
mercPic = r'merc.gif' 


buttonFrame = Frame(root) 
buttonFrame.pack(side=LEFT) 

textFrame = Frame(root) 
textFrame.pack(side=TOP) 


def sunInfo(): 

    sunImage = PhotoImage(file=sunPic) 
    img1 = Label(textFrame) 
    img1.configure(image = sunImage) 
    img1.image = sunImage 
    img1.pack() 


def mercInfo(): 

    mercImage = PhotoImage(file=mercPic) 
    img1.configure(image = mercImage) 
    img1.image = mercImage 
    img1.pack() 




sun = Button(buttonFrame, text="THE SUN",command=sunInfo) 
sun.pack(side=TOP) 

mercury = Button(buttonFrame, text="MERCURY",command=mercInfo) 
mercury.pack(side=TOP) 

venus = Button(buttonFrame, text="VENUS") 
venus.pack(side=TOP) 

earth = Button(buttonFrame, text="EARTH") 
earth.pack(side=TOP) 

mars = Button(buttonFrame, text="MARS") 
mars.pack(side=TOP) 

jupiter = Button(buttonFrame, text="JUPITER") 
jupiter.pack(side=TOP) 

saturn = Button(buttonFrame, text="SATURN") 
saturn.pack(side=TOP) 

uranus = Button(buttonFrame, text="URANUS") 
uranus.pack(side=TOP) 

neptune = Button(buttonFrame, text="NEPTUNE") 
neptune.pack(side=TOP) 

root.mainloop() # 

回答

0

畫面是不會改變的原因是因爲你需要更新部件。這也可以通過.place()方法來完成。將圖像放在相同的座標上,它會改變。

太陽圖片顯示多次的原因是由於.pack()方法。包方法會自動打包窗口小部件。您需要創建一個更新函數或使用上述的.place()方法。

最後,當您按下水銀按鈕時,img1未定義,因爲它沒有定義。您可以創建一個global並將全局置於太陽函數和水銀函數中。

刷新小部件的最簡單方法是使用.grid()方法,並且當您要刷新小部件時,請使用.grid_forget()

您應該閱讀this並瞭解您使用的小部件。

2

由於variable scope,它不工作。簡單地說:變量img1屬於功能suninfo(),所以當任何其他函數試圖訪問它,它不能,所以回溯告訴你:

NameError: global name 'img1' is not defined 

最好的解決將是把你的代碼,但最快的解決辦法是使img1超出功能,然後根據需要進行更新:

buttonFrame = Frame(root) 
buttonFrame.pack(side=LEFT) 

textFrame = Frame(root) 
textFrame.pack(side=TOP) 

img1 = Label(textFrame) #Create img1 outside the function 
img1.pack() 

def sunInfo(): 
    sunImage = PhotoImage(file=sunPic) 
    img1.pack_forget()     #Drop previous img1 picture 
    img1.configure(image = sunImage) 
    img1.image = sunImage 
    img1.pack()      #Re-pack as new image 

def mercInfo(): 
    mercImage = PhotoImage(file=mercPic) 
    img1.pack_forget() 
    img1.configure(image = mercImage) 
    img1.image = mercImage 
    img1.pack() 

sun = Button(buttonFrame, text="THE SUN",command=sunInfo) 
sun.pack(side=TOP) 

mercury = Button(buttonFrame, text="MERCURY",command=mercInfo) 
mercury.pack(side=TOP)