我正在创建一个脚本,该脚本将收集数据并使用openpyxl将其写入电子表格。试图在工作簿打开时保存它将导致permissionError,并在不保存文档的情况下从剪贴板中删除所有内容。
由于脚本执行时间太长,如果使用脚本的人打开工作簿,可能会让人头疼。为了防止这种情况,我正在尝试实现一个tkinter窗口,该窗口将告诉用户在发生permissionError时关闭excel工作表,并一直打开直到他们打开。
我想我把事情搞得太复杂了,我知道这不是最好的办法。我真的很感激任何关于如何以正确的方式做这件事的建议。下面是我现在拥有的代码:
import openpyxl as op
import tkinter
class warning:
def __init__(self, root):
self.root = root
self.root.title('WARNING')
self.text = tkinter.Label(root, text = 'Please close spreadsheet, then press "Ok" to proceed.' )
self.text.grid(row = 1)
self.frame = tkinter.Frame(root)
self.button = tkinter.Button(self.frame, text = 'Ok', command = tryToSave(book, 'companies.xlsx')).grid(row = 2, column = 0)
self.frame.grid(row = 2)
def close(self):
self.root.destroy()
def tryToSave(book, name):
message = tkinter.Tk()
functionality = warning(message)
try:
book.save(name)
functionality.close()
except PermissionError:
message.mainloop()
tryToSave(book, name)
book = op.load_workbook('C://Users/Alec/envs/RoboEmily/companies.xlsx')
tryToSave(book, 'C://Users/Alec/envs/RoboEmily/companies.xlsx')发布于 2017-10-21 03:11:46
我想我想得太多了。创建一个类似乎有点过分。我重新编写了原代码,作为一个简单的函数。
import openpyxl as op
import tkinter
def tryToSave(book, name):
while 1:
try:
book.save(name)
break
except PermissionError:
root = tkinter.Tk()
message = tkinter.Label(root, text = 'Please close spreadsheet and click "ok"')
message.grid(row = 1)
ok = tkinter.Button(root, text = 'Ok', command = root.destroy).grid(row = 2)
message.mainloop()
book = op.load_workbook('C://Users/Alec/envs/RoboEmily/companies.xlsx')
tryToSave(book, 'C://Users/Alec/envs/RoboEmily/companies.xlsx')这将创建一个tkinter窗口,指示用户关闭电子表格,并将持续到电子表格关闭,用户单击“确定”按钮。如果他们在关闭工作表之前单击该按钮,该窗口将被销毁并立即重新创建。
发布于 2017-10-18 15:04:44
所以,我唯一能想到的检查文件是否已关闭的“自动”方法是输出任务管理器的内容,并解析该文件是否打开,但这似乎非常低效,而且考虑得很糟糕。
一个更好的解决方案(主观上来说)是使用tkinter的Toplevel小部件,并让用户尝试在Toplevel中运行"Save“函数,如果它最初失败的话。
我创建了一个示例,您可以在下面查看:
from tkinter import *
class App:
def __init__(self, root):
self.root = root
#Below we declare the "message window"
self.top = Toplevel(self.root) #this creates the window
self.top.withdraw() #this hides the window
self.toplabel = Label(self.top, text="File is already open, please close first") #label for the window
self.topsave = Button(self.top, text="Save", command=self.save) #button for the window
#packing widgets for the toplevel
self.toplabel.pack()
self.topsave.pack()
self.button = Button(self.root, text="Save", command=self.save)
self.button.pack()
def save(self):
try:
with open("file.csv", "w") as f: #we open the file pythonically
f.write("Lorem ipsum") #we attempt to write to the file
self.top.withdraw() #we attempt to hide the top level window
except PermissionError:
self.top.deiconify() #if we get a PermissionError exception, we try and unhide the window
root = Tk()
App(root)
root.mainloop()这将创建一个带有保存按钮的窗口。一旦按下这个按钮,打开文件并尝试保存到它。如果保存失败,那么我们取消隐藏我们先前创建的窗口,并有一个保存按钮。按下这个保存按钮后,我们运行相同的函数(打开文件,尝试保存,取消隐藏窗口)。如果该函数再次失败,则用户不会发生明显的更改。如果函数成功,那么文件将保存到并且Toplevel窗口再次隐藏自己。
https://stackoverflow.com/questions/46807489
复制相似问题