Tkinter Listobox Selection重复调用一个Function / autorefresh

时间:2018-04-12 10:35:09

标签: python tkinter

我正在使用Tkinter实现在Python 3中运行GUI。

我正在使用我从数据库查询的一些值填充Listbox,并从Listbox中选择结果,我“绑定”一个函数。

tagsList.bind('<<ListboxSelect>>', get_anchors)

此函数/事件小部件再次查询另一个已保存某些PNG图像位置的数据库,并使用:ImageTk.PhotoImage(Image.open(path))将其作为PhotoImage导入GUI。它会填充所有这些图像的网格,如下面的代码所示:

def get_anchors(event):
    lb = event.widget
    index = lb.curselection()[0]
    tag_name = lb.get(index)

    # Get the anchor list from the database row
    alist = []
    for row in conn.execute("SELECT anchor FROM \"" + tag_name + "\" ORDER BY anchor"):
        alist.append(row[0])

    # ===== Import PNG Images =====
    i = 1
    for anchor in alist:
        j = 1
        for key in measurements:
            path = conn.execute("SELECT \"" + key + "\" FROM \"" + tag_name + "\" WHERE anchor = \"" + anchor +"\"").fetchone()[0]
            photo = ImageTk.PhotoImage(Image.open(path))
            label = tkinter.Label(mainWindow, relief="sunken", image=photo)
            label.image = photo
            label.grid(row=i, column=j, sticky='nsew')
            j += 1
        i += 1

问题: PNG图像随着时间的推移而变化,它们基本上被另一个程序中新生成的图像所取代。所以,我想知道这是否是一种自动重新刷新/加载新PNG文件的方法,而不必再单击/选择列表框中的相同结果,我已经选择了它。

PNG图像每5秒生成一次,如果这有帮助,它们基本上替换现有的(相同的文件名,位置等)。我希望,一旦从列表框中选择了特定的结果,可能会有像常量自动刷新功能/方法或至少一种方法来重复调用此get_anchors函数。

我无法真正找到能够启用此功能的东西,现在唯一的方法就是再次点击使用新PNG刷新网格的选项,再次调用get_anchors

1 个答案:

答案 0 :(得分:0)

不能完全确定为什么它以前不能与lb.after(5000, get_anchors, args=(event,))一起使用,但现在可以lb.after(5000, get_anchors, event)格式使用。

我基本上是从Tkinter主要代码中调用一个函数,如下所示:

tagsList.bind('<<ListboxSelect>>', get_anchors)

这是一个列表框,一旦我选择了选项,它就会调用get_anchors函数,并将其绑定到该函数。然后,我想要的是每6秒从同一函数get_anchors中重新调用该函数。代码如下:

def get_anchors(event):
    # ===== Clear canvas and re-assign it on GUI =====
    canvas.delete("all")
    canvas.grid(row=1, column=1, sticky='nsew', rowspan=17, columnspan=5, padx=(10, 0))
    image_plots = tkinter.Frame(canvas, background='white')
    canvas.create_window((0,0), window=image_plots, anchor='nw')

    lb = event.widget
    index = lb.curselection()[0]
    tag_name = lb.get(index)

    # Get the anchor list from the database row
    alist = []
    for row in conn.execute("SELECT anchor FROM \"" + tag_name + "\" ORDER BY anchor"):
        alist.append(row[0])

    # ===== Import PNG Images =====
    i = 1
    for anchor in alist:
        j = 1
        for key in measurements:
            path = conn.execute("SELECT \"" + key + "\" FROM \"" + tag_name + "\" WHERE anchor = \"" + anchor +"\"").fetchone()[0]
            photo = ImageTk.PhotoImage(Image.open(path))
            label = tkinter.Label(image_plots, relief="sunken", image=photo)
            label.image = photo  # Keeping reference is needed
            label.grid(row=i, column=j, sticky='nsew')
            j += 1
        i += 1

    # Refresh PNGs every 6s; they are generated roughly every 5s
    mainWindow.after(6000, get_anchors, event)

最后一行的此解决方案用于刷新Canvas并使用新的PNG填充它。使用args=(event,)解决方案,它不起作用。