gpt4 book ai didi

python - Tkinter 嵌套主循环

转载 作者:太空宇宙 更新时间:2023-11-03 21:47:21 25 4
gpt4 key购买 nike

我正在用 tkinter/python 编写一个视频播放器,所以基本上我有一个可以播放视频的 GUI。现在,我想实现一个停止按钮,这意味着我将有一个用于 GUI 的 mainloop() 和另一个用于播放/停止视频的嵌套 mainloop()并返回到 GUI 启动窗口。 Here ,据说:

Event loops can be nested; it's ok to call mainloop from within an event handler.

但是,我不明白如何实现这种嵌套。有人可以向我提供此类脚本的简单示例吗?

编辑

这是我的代码的一个工作版本,因为我似乎在做一些异国情调的事情。当然,我是新手,所以可能是我错误地理解了嵌套主循环的必要性。

#!/usr/bin/python

import numpy as np
from multiprocessing import Process, Queue
import cv2
import cv2.cv as cv
from PIL import Image, ImageTk
import Tkinter as tk

def image_capture(queue):
vidFile = cv2.VideoCapture(0)
while True:
flag, frame=vidFile.read()
frame = cv2.cvtColor(frame,cv2.cv.CV_BGR2RGB)
queue.put(frame)
cv2.waitKey(10)

def update_all(root, imagelabel, queue, process, var):
if var.get()==True:
im = queue.get()
a = Image.fromarray(im)
b = ImageTk.PhotoImage(image=a)
imagelabel.configure(image=b)
imagelabel._image_cache = b # avoid garbage collection
root.update()
root.after(0, func=lambda: update_all(root, imagelabel, queue, process, var))
else:
print var.get()
root.quit()

def playvideo(root, imagelabel, queue, var):
print 'beginning'
p = Process(target=image_capture, args=(task,))
p.start()
update_all(root, imagelabel, queue, p, var)
print 'entering nested mainloop'
root.mainloop()
p.terminate()
if var.get()==False:
im = ImageTk.PhotoImage(file='logo.png')
imagelabel.configure(image=im)
imagelabel._image_cache = im # avoid garbage collection
root.update()
var.set(True)
print 'finishing'

if __name__ == '__main__':
#initialize multiprocessing
task = Queue()
#GUI of root window
root = tk.Tk()
#the image container
image_label = tk.Label(master=root)
image_label.grid(column=0, row=0, columnspan=2, rowspan=1)
#fill label with image until video is loaded
bg_im = ImageTk.PhotoImage(file='logo.png')
image_label['image'] = bg_im
#frame for buttons
button_frame = tk.Frame(root)
button_frame.grid(column=0, row=1, columnspan=1)
#load video button and a switch to wait for the videopath to be chosen
load_button = tk.Button(master=button_frame, text='Load video',command=lambda: playvideo(root, image_label, task, switch))
load_button.grid(column=0, row=0, sticky='ew')
#Stop button
switch = tk.BooleanVar(master=root, value=True, name='switch')
stop_button = tk.Button(master=button_frame, text='Stop',command=lambda: switch.set(False))
stop_button.grid(column=0, row=1, sticky='ew')
#quit button
quit_button = tk.Button(master=button_frame, text='Quit',command=root.destroy)
quit_button.grid(column=0, row=2, sticky='ew')
root.mainloop()

最佳答案

这应该是 Tkinter 中嵌套主循环的示例:

import Tkinter

def main():
print 'main'
t.mainloop()
print 'end main'

t = Tkinter.Tk()
b = Tkinter.Button(t, command = main)
b.pack()
t.mainloop()

每当您按下按钮时,都会执行一个新的主循环。

main
main
main
main
main
# now close the window
end main
end main
end main
end main
end main

关于python - Tkinter 嵌套主循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17252056/

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