2014-03-30 40 views
0

我正在制作一个程序,为您提供有关星球/星星的信息和图片。我正在使用tkinter来这样做。Python - 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几次按钮,太阳的几个图像显示出来!我不想要这个。

我想做的事,这个方案做:

  • 创建与行星名称按钮。

  • 允许用户按了按钮

  • 的图片,在该行星的一些信息显示

  • 如果用户按下另一个按钮,图像和信息是由新行星的信息取代和图片。

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

谢谢。

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

画面是不会改变的原因是因为你需要更新部件。这也可以通过.place()方法来完成。将图像放在相同的坐标上,它会改变。

太阳图片显示多次的原因是由于.pack()方法。包方法会自动打包窗口小部件。您需要创建一个更新函数或使用上述的.place()方法。

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

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

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

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)