簡體   English   中英

Python - 帶標簽和照片的Tkinter

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM