使用wxpythongui加密文件

使用wxpythongui加密文件,python,wxpython,Python,Wxpython,我想在Python中使用加密对文件进行加密 我使用的是wx模块,这是一个GUI库,我的应用程序是这样的:如果用户单击Encrypt a File按钮,应用程序将打开文件资源管理器,他可以选择要加密的文件。当他点击一个文件并打开它时,我的函数将对它进行加密 但它不起作用,只是什么也没做,我没有收到任何错误,它似乎工作得很好,但它不是 有什么建议吗 import wx import os import random import ctypes from cryptography.fernet imp

我想在Python中使用
加密
对文件进行加密

我使用的是
wx
模块,这是一个GUI库,我的应用程序是这样的:如果用户单击
Encrypt a File
按钮,应用程序将打开文件资源管理器,他可以选择要加密的文件。当他点击一个文件并打开它时,我的函数将对它进行加密

但它不起作用,只是什么也没做,我没有收到任何错误,它似乎工作得很好,但它不是

有什么建议吗

import wx
import os
import random
import ctypes
from cryptography.fernet import Fernet

desktop = os.path.expanduser('~/Desktop')
fileKey = str(random.SystemRandom().randint(100, 1000)) + 'key.txt'

class myFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='Hello!', size=(600, 400), style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER)
        panel = wx.Panel(self)
        self.text_ctrl = wx.TextCtrl(panel, pos=(5, 5)) # Edit box
        EncryptButton = wx.Button(panel, label='Encrypt a File', pos=(475, 295), size=(100, 55)).Bind(wx.EVT_BUTTON, self.onOpen) # Encrypt Button
        self.Show() # Show Window

    def onOpen(self, event):
        fileFormat = 'All Files (*.*) | *.*'
        dialog = wx.FileDialog(self, 'Choose File', wildcard=fileFormat, style=wx.FD_OPEN ^ wx.FD_FILE_MUST_EXIST)
        path = dialog.GetPath()
        if dialog.ShowModal() == wx.ID_OK:
            try:
                key = Fernet.generate_key()
                tokenEnc = Fernet(key)
                with open(path, 'rb+') as fobj:
                    plainText = fobj.read()
                    cipherText = tokenEnc.encrypt(plainText)
                    fobj.seek(0)
                    fobj.truncate()
                    fobj.write(cipherText)
                    ctypes.windll.user32.MessageBoxW(0, 'We have Encrypted the File, also, We have created a file with the key in your Desktop.', 'Performed Successfully', 1)
                    with open(os.path.join(desktop, fileKey), 'wb') as keyFile:
                        keyFile.write(key)
            except Exception as e:
                return False

if __name__ == '__main__':
    app = wx.App()
    frame = myFrame()
    app.MainLoop()
问题是这个代码:

    path = dialog.GetPath()
    if dialog.ShowModal() == wx.ID_OK:
当您甚至没有显示对话框时,您正在询问路径。这将导致一个空字符串

如果用户验证了文件,则需要首先显示模式对话框,然后获取路径:

    if dialog.ShowModal() == wx.ID_OK:
        path = dialog.GetPath()
请注意,此构造不是良好的实践,它会阻止您调试可能发生的任何错误:

   except Exception as e:
        return False
至少如果发生了不好的情况,打印异常(或使用wx对话框向用户显示)


无关:当您可以使用标准wx消息框时,您使用的是windows原语
ctypes.windell.user32.MessageBoxW
,这使得您的程序windows依赖性几乎可能
除了异常,因为e:return False
捕获了一个您没有想到的异常,并且什么也没有发生。@Jean-Françoisfare谢谢!我得到的错误是“没有这样的文件或目录:“”,字符串为空。但是为什么呢?我从他打开的文件中找到了路径,对吗?哦!对,他甚至都没打开文件,我怎么没打开。谢谢你,珍!
   except Exception as e:
        print("something bad happened {}".format(e))
        return False