如何在方法后多次使用 Tkinter 或者是否有替代方法?

How to use Tkinter after method multiple times or is there alternative method for that?

我有可以在 tkinter 上显示网络摄像头 image/video 的程序。当我在 tkinter 中按下某个键(从键盘)或按钮(tkinter 按钮)时,我希望我的程序使用 运行 方法。这是我的代码:

from tkinter import *
from PIL import Image, ImageTk
import cv2

root = Tk()

label =Label(root)
label.grid(row=0, column=0)
cap= cv2.VideoCapture(0, cv2.CAP_DSHOW)

def show_frames():
   cv2image= cv2.cvtColor(cap.read()[1],cv2.COLOR_BGR2RGB)
   img = Image.fromarray(cv2image)
   imgtk = ImageTk.PhotoImage(image = img)
   label.imgtk = imgtk
   label.configure(image=imgtk)
   label.after(20, show_frames)

def method():
      print("test")

show_frames()
root.after(2000, method)
root.mainloop()

此代码的问题在于,首先它 运行 只有一次。然后我试着改变它的方法:

def method():
    while True:
      print("test")

问题是它首先冻结 window 并最终导致程序崩溃。即使只有这一条打印语句。

你建议我怎么做?或者我应该使用 after 以外的其他方法吗?

我添加了一个 key_pressed 函数,现在它可以处理多个按键,你可以在控制台上自己看到它。

from tkinter import *
from PIL import Image, ImageTk
import cv2

root = Tk()

label =Label(root)
label.grid(row=0, column=0)
cap= cv2.VideoCapture(0, cv2.CAP_DSHOW)

def show_frames():
   cv2image= cv2.cvtColor(cap.read()[1],cv2.COLOR_BGR2RGB)
   img = Image.fromarray(cv2image)
   imgtk = ImageTk.PhotoImage(image = img)
   label.imgtk = imgtk
   label.configure(image=imgtk)
   label.after(20, show_frames)

def key_pressed(event):
    method()

def method():
      print("test")

show_frames()
root.bind("<Key>", key_pressed)
root.mainloop()