python - 多线程是在 pysimplegui 脚本中跟踪经过时间的唯一方法吗?
问题描述
因此,我正在编写一个脚本,该脚本需要检查经过的时间并以特定的时间间隔执行某些操作。看起来 pysimplegui main_loop 结构完全是事件驱动的,所以我不能只在 while 循环中添加经过时间检查。我以前做过一次多线程,但我不太了解它,我想让它尽可能简单。
#!/usr/bin/python3
import PySimpleGUI as sg
import os.path
from datetime import datetime
import csv
csvName = ''
currentTime = datetime.now()
fileStartTime = datetime.now()
workingVideoFile = ''
recordingFlag = False
def mainLoop():
global recordingFlag
global csvName
global currentTime
global fileStartTime
global workingVideoFile
while True:
event, values = window.read()
if event == "Exit" or event == sg.WIN_CLOSED:
break
if event == "-FOLDER-":
folder = values["-FOLDER-"]
try:
csvSetup(str(folder))
window.FindElement("Start Recording").Update(disabled=False)
window.FindElement("Submit Log with Time Stamp").Update(disabled=False)
except:
print ('Trying to set destination folder')
print (Exception)
if event == "Start Recording":
try:
window.FindElement("Start Recording").Update(disabled=True)
window.FindElement("Stop Recording").Update(disabled=False)
fileStartTime = datetime.now()
# Sent Bash command or whatever
recordingFlag = True
except:
print ('Trying to start recording')
print (Exception)
if event == "Stop Recording":
try:
window.FindElement("Start Recording").Update(disabled=False)
window.FindElement("Stop Recording").Update(disabled=True)
# Send bash command or whatever
recordingFlag = False
except:
print ('Trying to stop recording')
print (Exception)
if event == "Submit Log with Time Stamp":
log = values["logText"].replace('\n', ' ')
now = datetime.now().strftime("%m/%d/%Y %H:%M:%S")
currentVideoName = "video 50:relative time" # get this
logEntry = [now,currentVideoName, log]
try:
with open(csvName, "a") as logFile:
logWriter = csv.writer(logFile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
logWriter.writerow(logEntry)
window.FindElement("logText").Update('')
except:
print ('Trying to write CSV')
print (Exception)
if recordingFlag:
print (datetime.now()-fileStartTime)
if recordingFlag and (datetime.now() - fileStartTime).total_seconds() >= 5:
print ('it has been an hour')
window.close()
def windowSetup():
global window
global layout
sg.theme('DarkBlue')
firstColumn = [
[
sg.Text("Select Location to Save Video File:"),
sg.In(size=(40, 1), enable_events=True, key="-FOLDER-"),
sg.FolderBrowse(),
],
[
sg.Text(" ")
],
[
sg.Multiline(size=(200, 50), key='logText')
],
[
sg.Text (" "),
sg.Button("Submit Log with Time Stamp", disabled=True),
],
]
secondColumn = [
[
sg.Button("Start Recording", disabled=True),
],
[
sg.Text(" ")
],
[
sg.Text(" ")
],
[
sg.Button("Stop Recording", disabled=True),
],
]
layout = [
[
sg.Column(firstColumn),
sg.Column(secondColumn)
]
]
def csvSetup(dirr):
global csvName
now = datetime.now().strftime("%m-%d-%Y")
csvName = dirr + "/" + now + ".csv"
if not os.path.exists(csvName):
try:
with open(csvName, "w") as logFile:
logWriter = csv.writer(logFile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
logWriter.writerow(['TIMESTAMP', 'VIDEO TIMESTAMP', 'LOG'])
except:
print('In csvSetup Function')
print(Exception)
windowSetup()
window = sg.Window("Video Recorder", layout)
mainLoop()
解决方案
我去给我的
event, values = window.read()
文件为
event, values = window.read(timeout=500)
强制循环每半秒运行一次,所以我可以将经过时间检查添加到循环的末尾
推荐阅读
- vue.js - [Vue 警告]:客户端渲染的虚拟 DOM 树与服务器渲染的内容不匹配( Nuxt / Vue / lerna monorepo )
- angular - 茉莉花测试失败 - 但日志表明并非如此
- c - 从 C 中的 C 样式字符串中获取位序列?
- reactjs - 在输出中看不到值
- flutter - Flutter 的设备日历插件
- bash - Bash脚本检查文件夹中的文件,然后将文件移动到根目录并删除空目录
- lift - 无法在 Databricks 中安装 net.liftweb:lift-json_2.13
- vim - VI 读取行没有给出所需的输出
- android - Android 列表适配器未使用 Live Data、ViewHolder 和 ViewModelProvider 显示所有数据
- javascript - MongoDB 如何仅在某些嵌入文档中防止重复名称值?