Python Tkinker如何循环浏览图像?

Python Tkinker如何循环浏览图像?,python,tkinter,Python,Tkinter,我有很多og base64图像存储在熊猫数据帧df\u time\u text\u frames中。现在,我想制作一个简单的程序,向我显示图像,并有一个按钮NEXT(下一个)或PREVIOUS(上一个)来浏览图像 我试过: 我定义了一个函数load\u next\u img,当我按下tk.按钮时触发该函数,称为next,然后该函数应显示全局计数器给出的帧,该计数器每次按下该按钮时递增 尚未实施: 我对buttomprevious有一个类似的函数,它将从全局变量计数器中减去1 import tki

我有很多og base64图像存储在熊猫数据帧
df\u time\u text\u frames
中。现在,我想制作一个简单的程序,向我显示图像,并有一个按钮NEXT(下一个)或PREVIOUS(上一个)来浏览图像

我试过:

我定义了一个函数
load\u next\u img
,当我按下
tk.按钮时触发该函数,称为
next
,然后该函数应显示全局
计数器给出的帧,该计数器每次按下该按钮时递增

尚未实施:

我对buttom
previous
有一个类似的函数,它将从全局变量
计数器中减去1

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()
首先,它不起作用。我得到:

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

我没有收到任何错误,但图像不会显示。

如果可能,您可以共享一个指向完整源代码的链接,因为这将更容易使用所有代码进行调试

从最初的阅读中,我看到了这一行

tk.Label(root, image=im).pack()
但是
im
不在此范围内定义。尝试用
image
更改
im
,并检查是否再次出现错误

关于问题的第二部分:
是的,有更好的方法可以做到这一点,但我认为这超出了这个问题的范围,您可以从删除全局变量的使用开始。

我看到了一些问题,这些问题可能是问题的原因,也可能不是问题的原因

  • 不需要将计数器作为参数来加载下一个图像,因为您已经全局声明了它。将计数器作为参数删除,并在函数命名空间中包含计数器,如下所示:
  • 全局计数器
    计数器=0
    def load_next_image():
    全局计数器
    #代码的其余部分
    计数器+=1
    
  • 编写
    command=load\u next\u image(计数器)
    并不是在做你认为它在做的事情。命令接受“无”或可调用对象(如函数)。您要做的是,当创建按钮时,将命令设置为等于
    load\u next\u image(计数器)
    的输出,该按钮为无,因为
    load\u next\u image
    不返回任何内容

    如果不需要向函数传递任何参数,正确的方法是
    command=load\u next\u image
    ,它将命令设置为与实际函数句柄相等。单击按钮时,将执行函数

    如果确实需要向函数传递参数(有时是必要的),则应使用
    lambda
    语句(请参阅)

  • nextbutton=tk.Button(text=“next”,
    命令=lambda计数器:加载下一个图像(计数器))
    

    同样,这是因为lambda返回匿名函数的句柄,而不是函数本身的结果。然而,在您的例子中,如果像我在(1)中提到的那样将计数器实现为全局变量,则不必担心这个问题(因为您不需要传递参数)。

    谢谢您的回答。请看一下我的最新问题。也许你能发现我的错误?谢谢我不确定执行
    tk.Label(root,image=im.pack()
    时,
    im
    是什么。正如Rohan在回答中所建议的,您可能应该将其更改为
    tk.Label(root,image=image).pack()
    tk.Label(root, image=im).pack()