【问题标题】:Efficiently create tkinter images using a loop使用循环有效地创建 tkinter 图像
【发布时间】:2020-03-29 13:52:15
【问题描述】:

目前我遍历图像名称列表并将它们变成 tkinter PhotoImage。使用 vars()[var] 从列表中以它们各自的名称将它们保存为变量。 在这种情况下 vars()[var] 表示列表中项目的值,使其成为图像的变量名称。

示例如下:

list = ["a","b","c","d"] #and so on...
image_id = []

for x in range((len)list):
    var = list[x]
    vars()[var] = tk.PhotoImage(file = var + ".gif")
    image_id.append(vars()[var])  #this adds the identity of all photoimages to a list for later use

根据我的测试,只要图像在同一个函数中,我就可以通过变量名称或身份使用图像。这是由于变量是局部的。 问题是,即使图像标识在列表中,它们在原始函数之外使用时也不起作用。我相信这是因为图像与它们的变量名相关联,并且因为这些都是本地 tkinter 垃圾收集它们,导致我的错误是“pyimagenumber 不存在”。这是因为 tkinter 图像的标识只是“pyimage”及其对应的数字。我的思路是,我想让所有存储图像的变量名称都是全局的,而不需要每个图像额外的一行,因为这违背了使用循环和列表的目的。有什么办法可以将“vars()[var]”设置为全局的,同时也给它一个值?

对于任何解决方案,我都希望避免根本性的改变或使用枕头。 任何帮助表示赞赏,如果您对上下文有其他疑问,请询问!

【问题讨论】:

    标签: python-3.x tkinter


    【解决方案1】:

    只需将您的空列表移到您的函数之外。也不要使用for x in range(len(list)),而是使用for x in something。可能是这样的:

    import tkinter as tk
    
    root = tk.Tk()
    image_id = []
    
    def image_creation():
        imlist = ["a","b","c","d"] #don't name it as list - it shadows the built in list
        for var in imlist: 
            image_id.append(tk.PhotoImage(file = var + ".gif"))
    
    ... #the rest of your code
    
    root.mainloop()
    

    【讨论】:

    • 感谢帮助和效率改进,但同样的问题仍然存在。 pyimage12 不存在,所以我仍然相信它正在被垃圾收集。我的代码中也有函数之外的列表,只是在我的示例中没有显示。我认为不将图像绑定到变量名可以工作,但是哦...
    • 你是否多次调用 mainloop?
    【解决方案2】:

    没有必要使用vars()。只需在全局命名空间中创建一个字典并将您的图像添加到其中。您甚至可以使用列表中的原始项目作为键。

    例子:

    global images
    ...
    list = ["a","b","c","d"]
    images = {}
    for x in list:
        images[x] = tk.PhotoImage(file = var + ".gif")
    

    然后,可以随时以images['a'] 访问“a”的图像。

    【讨论】:

    • 这是一个不错的方法,但经过测试,似乎图像仍然会被垃圾收集......
    • @blu_pi:如果images 是全局的或对象的属性,它们将不会被垃圾回收。
    • 如果不是,那么我的代码肯定有另一个问题。在使用字典将图像及其文件名保存为键后,当我尝试在函数之外使用它们时,它们仍然“不存在”。字典本身也应该是全局的。
    • @blu_pi:如果是这种情况,请编辑您的问题以包含minimal reproducible example。我们只能继续您发布的代码,并且此代码是问题中代码的适当替换。
    • 最终我认为图像的垃圾收集有问题。我必须以一种或另一种方式阻止它发生......我会尽快尝试制作 MRE。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多