我在网格上制作了一本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中运行?
答案 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