在Tkinter中def如何工作?

时间:2013-02-22 11:28:11

标签: button tkinter photo function

我在网格上制作了一本Tkinter书,这些按钮在左侧向下滚动,照片显示在右侧列上,显示了许多行,因此按钮显示为应有的。制作这本Tkinter书时。 我在网格上做了一个按钮

left1 = Button(win, text=" Captian Scarlet ")# win, is root master
left1.configure(command=but1)# but1 is my first def
left1.grid(row=1, column=0)# all the buttons are on the left list

这显示并像没有def的按钮一样工作

然后我做了一个def

def but1():
    img = Image.open("captain_scarlett.gif")# loads the gif file
    intro = ImageTk.PhotoImage(img)# loads image drivers I belevie
    right1 = Label(win, image=intro)# I think Lable is used the same as html <span>
    right1.grid(row=0, column=1, rowspan=13)# image formatting to display correctly with buttons

因为我当时缺乏教育,所以我只能将图像置于def之外。所以在沮丧中我发布了 “这个代码在没有放入def时可以正常工作”。 当我安顿下来时,我需要在网上找不到的知识,所以我问了一个问题: 那么如何让这段代码在def中运行?

2 个答案:

答案 0 :(得分:0)

是什么让你觉得它不起作用?在这方面,Tkinter并没有什么特别之处;任何在def之外工作的东西肯定会在def中运行。对于所有python代码,唯一的警告是相同的。例如,你在def中创建的任何变量都是本地的,除非另有声明,并且在执行def之后,对象(但不是小部件)可能会被垃圾收集。

可能发生的事情是您正在创建图像并在局部变量中存储对它的引用。当def停止执行时,图像对象被垃圾收集。您需要保留对可以保留的图像的引用。一个简单的解决方案可能是right1.image=intro

答案 1 :(得分:0)

此代码可以正常运行。现在我的作品可以全力以赴

这是完成的代码

def but1():
    img = Image.open("captain_scarlett.gif")
    intro = ImageTk.PhotoImage(img)
    right = Label(win, image=intro)
    right.grid(row=0, column=1, rowspan=14)
    right.image=intro