我正在制作一个程序,为您提供有关行星/恒星的信息和图片。我正在使用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() #
答案 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并了解您使用的小部件。