2017-10-18 209 views
0

我正在創建一個腳本,收集數據並使用openpyxl將其寫入電子表格。在打開工作簿時嘗試保存工作簿會導致出現permissionError並從剪貼板中刪除所有內容而不保存文檔。Tkinter窗口,以防止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') 

回答

0

我覺得我是在反思這個。創建一個類似乎有點矯枉過正。我已經將原始代碼重新編寫爲一個更簡單的函數。

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的窗口指導用戶關閉電子表格,並會持續到電子表格被關閉,用戶點擊「確定」按鈕。如果他們在關閉工作表之前點擊該按鈕,該窗口將被銷燬並立即重新創建。

0

所以,我能想到的唯一的辦法有一個「自動」檢查已關閉該文件是否是輸出任務的內容的方式經理和解析文件是否是開放的,但這似乎是非常低效率和糟糕的想法。

一個更好的解決方案(主觀地說)是使用tkinter的Toplevel小部件,並讓用戶嘗試再次從Toplevel運行「保存」功能(如果它最初失敗)。

我創造了你可以在下面看一個例子:

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() 

這將創建一個保存按鈕的窗口。按下此按鈕後,打開文件並嘗試保存。如果保存失敗,我們取消隱藏一個我們之前創建的窗口,並且還有一個保存按鈕。按下這個保存按鈕後,我們運行相同的功能(打開文件,嘗試保存,取消隱藏窗口)。如果該功能再次失敗,則用戶無法看到任何改變。如果該功能成功,則文件將保存到並且窗口再次隱藏。