我在pandas数据框df_time_text_frames
中存储了很多base64图像。现在,我想编写一个简单的程序,向我显示图像,并使用按钮NEXT(下一个)或PREVIOUS(上一个)浏览图像。
我尝试过:
我定义了一个函数load_next_img
,当我按下称为tk.Button
的{{1}}时会触发该函数,然后该函数应显示由全局next
给出的帧,该帧每次都会递增我按这个按钮。
尚未实施:
对于臀部counter
,我会有类似的功能,它将从全局变量previous
中减去1。
counter
首先,它不起作用。我得到:
import tkinter as tk
from PIL import ImageTk, Image
global counter
counter = 0
def load_next_img(counter):
global tk_image
image_data_base64_encoded_string = df_time_text_frames["Frame_(base_64)"][counter]
image = tk.PhotoImage(image_data_base64_encoded_string)
tk.Label(root, image=im).pack()
counter += 1
root = tk.Tk()
nextbutton = tk.Button(text="next", command=load_next_img(counter))
nextbutton.pack()
root.mainloop()
...而且我想知道,是否有更容易/更好的方法呢?
编辑1: 我尝试了以下方法:
---------------------------------------------------------------------------
TclError Traceback (most recent call last)
<ipython-input-24-bc9ac8d3c57e> in <module>()
14 root = tk.Tk()
15 root = tk.Toplevel()
---> 16 nextbutton = tk.Button(text="next", command=load_next_img(counter))
17 nextbutton.pack()
18
<ipython-input-24-bc9ac8d3c57e> in load_next_img(counter)
9 image_data_base64_encoded_string = df_time_text_frames["Frame_(base_64)"][counter]
10 image = tk.PhotoImage(image_data_base64_encoded_string)
---> 11 tk.Label(root, image=im).pack()
12 counter += 1
13
~\Anaconda3\lib\tkinter\__init__.py in __init__(self, master, cnf, **kw)
2761
2762 """
-> 2763 Widget.__init__(self, master, 'label', cnf, kw)
2764
2765 class Listbox(Widget, XView, YView):
~\Anaconda3\lib\tkinter\__init__.py in __init__(self, master, widgetName, cnf, kw, extra)
2294 del cnf[k]
2295 self.tk.call(
-> 2296 (widgetName, self._w) + extra + self._options(cnf))
2297 for k, v in classes:
2298 k.configure(self, v)
TclError: image "pyimage8" doesn't exist
我没有错误,但是图像没有显示。
答案 0 :(得分:2)
我发现与此有关的一些问题可能是也可能不是问题的原因。
global counter
counter = 0
def load_next_image():
global counter
# rest of your code
counter += 1
写command=load_next_image(counter)
并没有完成您认为正在做的事情。命令接受“无”或可调用对象(如函数)。您正在执行的操作是在创建按钮时将命令设置为等于load_next_image(counter)
的输出,这是None,因为load_next_image
不返回任何内容。
如果不需要将任何参数传递给函数,则正确的方法是command=load_next_image
,它将命令设置为等于实际函数句柄。单击该按钮后,将执行您的功能。
如果确实需要将参数传递给函数(有时是必需的),则应使用lambda
语句(请参见this)。
nextbutton = tk.Button(text="next",
command=lambda counter: load_next_image(counter))
同样,这是有效的,因为lambda返回了匿名函数的句柄,而不是函数本身的结果。但是,就您而言,如果您将计数器实现为全局变量(如我在(1)中提到的那样),则无需担心这一点(因为您不需要传递参数)。
答案 1 :(得分:0)
如果可能的话,您可以共享完整源代码的链接,因为使用所有代码进行调试将更容易。
通过初步阅读,我看到了这一行。
tk.Label(root, image=im).pack()
但是im
不在此范围内定义。尝试将im
更改为image
,然后检查是否再次收到错误消息
关于问题的第二部分: 是的,可能会有更好的方法来执行此操作,但是我认为这超出了这个问题的范围,您可以从删除全局变量的使用开始。