[英]Python - Tkinter with labels & photos
我正在制作一個程序,為您提供有關行星/恆星的信息和圖片。 我正在使用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
此外,如果我多次按下太陽按鈕,會出現幾張太陽圖像! 我不想這樣。
我想在這個程序中做什么:
創建帶有行星名稱的按鈕。
允許用戶按下這些按鈕
圖片和該星球上的一些信息顯示出來
如果用戶按下另一個按鈕,則PICTURE和INFORMATION將替換為新的PLANETS信息和圖片。
這是我今晚需要完成的一個項目。 我有很少的經驗,我需要幫助。
謝謝。
也:
這是我正在處理的完整代碼:
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() #
由於范圍可變,它無法正常工作。 簡單地說:變量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)
圖片未更改的原因是您需要更新窗口小部件。 這也可以通過.place()
方法完成。 將圖像放在相同的坐標上,它會改變。
太陽圖片多次顯示的原因是因為.pack()
方法。 pack方法自動打包小部件。 您需要創建更新函數或使用上述的.place()
方法。
最后,當您按下水銀按鈕時,未定義img1,因為它未定義。 您可以創建global
並將全局置於sun函數和mercury函數中。
刷新窗口小部件的最簡單方法是使用.grid()
方法,當您想要刷新窗口小部件時,請使用.grid_forget()
。
你應該在閱讀了本 ,了解你使用的小工具。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.