如何在方法后多次使用 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()
我有可以在 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()