【问题标题】:Python - Tkinter with labels & photosPython - 带有标签和照片的 Tkinter
【发布时间】:2014-03-30 18:49:09
【问题描述】:

我正在制作一个程序,为您提供有关行星/恒星的信息和图片。我正在使用 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)

当您按下按钮时,它应该会更改图像。所以说如果我按 THE SUN 按钮,就会出现一张太阳图片,然后我按 MERCURY 按钮,一张水银图片将取代太阳图片。

但是,这不起作用。当我单击水银按钮时,会出现此错误:

img1.configure(image = mercImage)
NameError: global name 'img1' is not defined

另外,如果我按几次“太阳”按钮,就会出现几张太阳的图像!我不想要这个。

我想在这个程序中做什么:

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

  • 允许用户按下这些按钮

  • 出现了该星球上的图片和一些信息

  • 如果用户按下另一个按钮,图片和信息将被新的行星信息和图片替换。

这是我今晚必须完成的项目。我几乎没有 tkinter 经验,我需要帮助。

谢谢。

还有:

这是我正在处理的完整代码:

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

【问题讨论】:

    标签: python tkinter python-3.3


    【解决方案1】:

    由于variable scope,它无法正常工作。简单来说:变量img1属于函数suninfo(),所以当任何其他函数试图访问它时,它都不能,所以traceback告诉你:

    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)
    

    【讨论】:

      【解决方案2】:

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

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

      最后,当您按下水银按钮时,img1 未定义,因为它未定义。您可以创建一个global 并将全局放在sun 函数和mercury 函数中。

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

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

      【讨论】:

        猜你喜欢
        • 2013-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-28
        • 1970-01-01
        相关资源
        最近更新 更多