我正在使用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
。
答案 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,)
解决方案,它不起作用。