gpt4 book ai didi

python - Tkinter 如何循环浏览图像?

转载 作者:行者123 更新时间:2023-12-01 01:01:28 25 4
gpt4 key购买 nike

我有很多 og base64 图像存储在 pandas 数据帧 df_time_text_frames 中。现在,我想制作一个简单的程序,它向我显示图像,并有一个“下一个”或“上一个”按钮来浏览图像。

我尝试过:

我定义了一个函数load_next_img,当我按下名为nexttk.Button时会触发该函数,然后应该显示由下式给出的帧一个全局计数器,每次按下此按钮时都会递增。

尚未实现:

我会对按钮previous有一个类似的函数,它会从全局变量counter中减去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

...我想知道是否有更简单/更好的方法来做到这一点?

编辑1:我尝试了以下方法:

import tkinter as tk
from PIL import ImageTk, Image


global counter
counter = 0


def load_next_img(counter):
#global counter
# rest of your code
counter += 1
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=lambda counter: load_next_image(counter))
nextbutton.pack()

root.mainloop()

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

最佳答案

我发现了一些与此相关的问题,这些问题可能是也可能不是问题的原因。

  1. 不需要将 counter 作为 load_next_image 的参数,因为您已经在全局范围内声明了它。删除计数器作为参数并将计数器包含在函数命名空间中,如下所示:
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 ,它将 command 设置为等于实际的函数句柄。单击该按钮时,您的函数将执行。

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

  •  nextbutton = tk.Button(text="next", 
    command=lambda counter: load_next_image(counter))

    同样,这是有效的,因为 lambda 返回匿名函数的句柄,而不是函数本身的结果。但是,在您的情况下,如果您像我在 (1) 中提到的那样将 counter 实现为全局变量(因为您不需要传递参数),则无需担心这一点。

    关于python - Tkinter 如何循环浏览图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55767128/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com