叮叮当如何遍历图像?

时间:2019-04-19 19:50:57

标签: python tkinter

我在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

我没有错误,但是图像没有显示。

2 个答案:

答案 0 :(得分:2)

我发现与此有关的一些问题可能是也可能不是问题的原因。

  1. 由于您已经全局声明了计数器,因此不需要将counter作为load_next_image的参数。删除counter作为参数,并在如下所示的函数名称空间中包含counter:
global counter
counter = 0
def load_next_image():
    global counter
    # rest of your code
    counter += 1
  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,然后检查是否再次收到错误消息

关于问题的第二部分: 是的,可能会有更好的方法来执行此操作,但是我认为这超出了这个问题的范围,您可以从删除全局变量的使用开始。