首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tkinter窗口防止PermissionError

Tkinter窗口防止PermissionError
EN

Stack Overflow用户
提问于 2017-10-18 09:57:09
回答 2查看 132关注 0票数 0

我正在创建一个脚本,该脚本将收集数据并使用openpyxl将其写入电子表格。试图在工作簿打开时保存它将导致permissionError,并在不保存文档的情况下从剪贴板中删除所有内容。

由于脚本执行时间太长,如果使用脚本的人打开工作簿,可能会让人头疼。为了防止这种情况,我正在尝试实现一个tkinter窗口,该窗口将告诉用户在发生permissionError时关闭excel工作表,并一直打开直到他们打开。

我想我把事情搞得太复杂了,我知道这不是最好的办法。我真的很感激任何关于如何以正确的方式做这件事的建议。下面是我现在拥有的代码:

代码语言:javascript
复制
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')
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-21 03:11:46

我想我想得太多了。创建一个类似乎有点过分。我重新编写了原代码,作为一个简单的函数。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-10-18 15:04:44

所以,我唯一能想到的检查文件是否已关闭的“自动”方法是输出任务管理器的内容,并解析该文件是否打开,但这似乎非常低效,而且考虑得很糟糕。

一个更好的解决方案(主观上来说)是使用tkinter的Toplevel小部件,并让用户尝试在Toplevel中运行"Save“函数,如果它最初失败的话。

我创建了一个示例,您可以在下面查看:

代码语言:javascript
复制
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窗口再次隐藏自己。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46807489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档