我正在制作一个程序,给你提供关于行星/恒星的信息和图片。我正在用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)当你按下一个按钮,它应该改变图像。所以,如果我按下太阳按钮,太阳的照片就会出现,然后我按下水星按钮,一张水星的图片会取代太阳的照片。
然而,这是行不通的。当我单击水银按钮时,会出现以下错误:
img1.configure(image = mercImage)
NameError: global name 'img1' is not defined另外,如果我按了几次太阳按钮,几张太阳的图片就会出现!我不想这样。
我在这个节目中想做的是:
这是我今晚要完成的一个项目。我没什么经验,我需要帮助。
谢谢。
此外:
下面是我正在编写的完整代码:
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() # 发布于 2014-03-30 19:26:10
因为可变范围,它不起作用了。简单地说:变量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)发布于 2014-03-30 19:18:21
图片没有改变的原因是您需要更新小部件。这也可以通过.place()方法来实现。将图像放置在相同的坐标上,就会发生变化。
太阳图片多次显示的原因是.pack()方法。pack方法自动打包小部件。您需要创建一个update函数或使用上面提到的.place()方法。
最后,当您按水银按钮时,没有定义img1,因为它没有定义。您可以创建一个global,并将全局函数放在sun函数和水银函数中。
刷新小部件的最简单方法是使用.grid()方法,当您想刷新小部件时,使用.grid_forget()。
您应该阅读这并了解您使用的小部件。
https://stackoverflow.com/questions/22748267
复制相似问题