簡體   English   中英

Tkinker 如何循環圖像?

[英]Tkinker How to loop through images?

我有很多 og base64 圖像存儲在熊貓數據幀df_time_text_frames 現在,我想做一個簡單的程序,它向我顯示圖像並有一個按鈕 NEXT 或 PREVIOUS,用於瀏覽圖像。

我試過:

我定義了一個函數load_next_img ,當我按下調用nexttk.Button時觸發它,然后它應該顯示由全局counter給出的幀,每次我按下這個按鈕時都會增加。

尚未實現:

我會對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的參數,因為您已經全局聲明了它。 刪除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語句(請參閱參考資料 )。

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

同樣,這是有效的,因為lambda返回了匿名函數的句柄,而不是函數本身的結果。 但是,對於您的情況,如果您將計數器實現為全局變量(如我在(1)中提到的那樣),則不必擔心這一點(因為您不需要傳遞參數)。

如果可能,您可以共享完整源代碼的鏈接,因為使用所有代碼進行調試將更容易。

通過初步閱讀,我看到了這一行。

tk.Label(root, image=im).pack()

但是im不在此范圍內定義。 嘗試使用image更改im ,然后再次檢查是否出現錯誤

關於問題的第二部分:是的,可能會有更好的方法來執行此操作,但是我認為這超出了此問題的范圍,您可以從刪除全局變量的使用開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM