我试图编写一个程序,列出一个文件夹中的所有.xml文件,然后将它们复制到另一个目录并从原始目录中删除。程序的这一部分工作得很好。我想让它这样我可以点击一个按钮在图形用户界面,让它扫描和处理文件夹,直到我按下一个按钮关闭它。再次强调,打开它不是问题,但试图停止它让我左右为难。我想在这中间再等一段时间时间。睡觉(x) 冻结整个程序,在它停止休眠之前不让我输入任何命令,只让它处理然后再次休眠。关于如何从GUI tkinter按钮启动/停止while循环有什么建议吗?在
代码如下:
#! python3
import glob
import time
import shutil
import os
import sys
import datetime
import errno
import re
import fnmatch
import tkinter # copy tcl8.5 and tk8.5 to folder
from tkinter import ttk
import sched
flag = 0
with open("config.ini") as f:
g = f.readlines()
sourcedir = g[0][10:-1]
ICdir = g[1][13:-1]
BUdir = g[2][13:-1]
LOGdir = g[3][8:-1]
el = g[4][3:-1]
# reads directories from config.ini
h = len(sourcedir)
# obtains length of address, used later on
def exemel():
m = sorted(glob.glob(sourcedir+"/*.xml"), key=os.path.getmtime)
n = len(m)
if n == 0:
print("none left")
for item in range(n):
try:
m = sorted(glob.glob(sourcedir+"/*.xml"), key=os.path.getmtime)
n = len(m)
if n == 0:
print("none left")
global flag
if flag == 5:
flag = 0
item = item + 1
with FileLock(m[item]):
k = h - len(m[item])
g = m[item][k:]
shutil.copy(m[item], ICdir)
shutil.move(m[item], BUdir)
print(m[item] + " successfully processed.")
dated = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
if os.path.exists(LOGdir):
with open(LOGdir, "a") as logging:
logline = '\n' + '"' + g[1:] + '", #' + dated + "# copied"
logging.write(logline)
else:
with open(LOGdir, "w") as logging:
logline = '"' + g[1:] + '", #' + dated + "# copied"
logging.write(logline)
except PermissionError:
print("File in use, waiting..")
time.sleep(1.5)
flag += 1
continue
except shutil.Error as e:
os.remove(ICdir + g)
os.remove(BUdir + g)
print("Existing files removed..")
dated = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
if el == "1":
if os.path.exists(LOGdir):
with open(LOGdir, "a") as logging:
logline = '\n' + '"' + g[1:] + '", #' + dated + "# overwritten"
logging.write(logline)
else:
with open(LOGdir, "w") as logging:
logline = '"' + g[1:] + '", #' + dated + "# overwritten"
logging.write(logline)
except IndexError:
item = 0
continue
except SystemExit:
break
except keyboardInterrupt:
break
def prunt():
print("ZES")
def config():
print("config")
def stop():
print("stop")
global x
x = False
global STOP
STOP = True
s = sched.scheduler(time.time, time.sleep)
def run_periodically(start, end, interval, func):
event_time = start
while event_time < end:
s.enterabs(event_time, 0, func, ())
event_time += interval
s.run()
def starter():
run_periodically(time.time(), time.time()+600, 60, exemel)
### GUI BEGIN ###
root = tkinter.Tk()
root.title("XML Wizard")
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=("N","W", "E", "S"))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)
sourceEntry = ttk.Entry(mainframe, width=50, textvariable=sourcedir)
sourceEntry.grid(column=2, row = 1, columnspan=2)
ttk.Label(mainframe, text="Source Directory:").grid(column=1, row=1, sticky="W")
BackupEntry = ttk.Entry(mainframe, width=50, textvariable=BUdir)
BackupEntry.grid(column=2, row = 2, columnspan=2)
ttk.Label(mainframe, text="Backup Directory:").grid(column=1, row=2, sticky="W")
ImportEntry = ttk.Entry(mainframe, width=50, textvariable=ICdir)
ImportEntry.grid(column=2, row = 3, columnspan=2)
ttk.Label(mainframe, text="Import Directory:").grid(column=1, row=3, sticky="W")
ttk.Button(mainframe, text="Go", command=starter).grid(column=4, row=5, sticky="W")
ttk.Button(mainframe, text="Save Config", command=config).grid(column=5, row=4, sticky="W")
ttk.Button(mainframe, text="Load Config", command=config).grid(column=5, row=3, sticky="W")
ttk.Button(mainframe, text="Stop", command=stop).grid(column=3, row=5, sticky="W")
root.mainloop()
FileLock函数在这里被发现了,如果你想知道的话,它可以很好地工作,但是为了空间/可读性,我把它省略了。我知道我的代码很草率,但我才刚刚开始编程。在
欢迎任何建议/替代方法!在
顺便说一句:exemel是我想要循环的函数!在
基本思想是使用一个处理单个文件的函数,然后使用事件循环反复调用该函数,直到不再需要处理其他文件为止。您可以使用
after
命令执行此操作。在在函数内部,您还可以检查全局标志。如果设置了标志,则函数不执行任何工作,也不计划要执行的任何工作。使用暂停按钮设置标志。一旦你设置好了,调用你的函数一次,它将继续运行,直到所有文件都被处理完。在
例如:
这将检查您是否已暂停工作。如果没有,它将从文件堆栈中提取一个文件进行处理。然后,如果还有更多的工作要做,它会安排下一个要在10毫秒内处理的文件
假设实际工作只需要几百毫秒,那么您的GUI将保持响应,并且复制在“后台”进行。我用引号括起来,因为这一切都发生在主线程上,而不是后台线程或进程上,但它发生在GUI不做任何其他事情的时候(实际上大多数情况下)。在
相关问题 更多 >
编程相关推荐