Python - 带标签的Tkinter&相片

时间:2014-03-30 18:49:09

标签: python tkinter python-3.3

我正在制作一个程序,为您提供有关行星/恒星的信息和图片。我正在使用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按钮,会出现几张太阳图像!我不想要这个。

我想在这个计划中做些什么:

  • 创建带有行星名称的按钮。

  • 允许用户按下这些按钮

  • 图片和该星球上的一些信息显示

  • 如果用户按下另一个按钮,则PICTURE和INFORMATION将替换为新的PLANETS信息和图片。

这是我今晚要完成的一个项目。我有很少的经验,我需要帮助。

谢谢。

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() # 

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

图片无法更改的原因是您需要更新窗口小部件。这也可以通过.place()方法完成。将图像放在相同的坐标上,它会改变。

太阳图片多次显示的原因是.pack()方法。 pack方法自动打包小部件。您需要创建更新功能或使用上述.place()方法。

最后,当您按下水银按钮时,img1未定义,因为它未定义。您可以创建global并将全局置于太阳功能和水银功能中。

刷新小部件的最简单方法是使用.grid()方法,当您想要刷新小部件时,请使用.grid_forget()

您应该阅读this并了解您使用的小部件。