首页 > 解决方案 > 多线程是在 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()

标签: pythontimerpython-multithreadingpysimplegui

解决方案


我去给我的

event, values = window.read()

文件为

event, values = window.read(timeout=500)

强制循环每半秒运行一次,所以我可以将经过时间检查添加到循环的末尾


推荐阅读