Python:需要一个仅在首次启动时运行的函数

时间:2013-12-23 14:29:24

标签: python

正如标题所说,我需要一个仅在您第一次使用该程序时运行的功能。我正在制作一个密码管理器,这个功能是为用户创建一个独特的加密密钥,这将使我的密码牢不可破。我使用GUI上的按钮来调用此函数,并且我试图让它工作的方式是使用.txt文件作为内存,不管它是否是第一次。

这就是我所拥有的:

def create_key():

    x = open("passfile.txt", "r")
    y = open("passfile.txt", "a")
    lines = x.readlines()
    for s in lines:
        if "nofirst" in s:
            pass
        else:
            a = str(randint(1,8))
            b = str(randint(1,9))
            c = str(randint(1,10))
            d = str(randint(1,11))
            e = str(randint(1,12))
            f = str(randint(1,13))
            g = str(randint(1,14))
            h = str(randint(1,15))
            i = str(randint(1,16))
            j = str([a,b,c,d,e,f,g,h,i])
            k = ''.join(j)            
            tkMessageBox.showinfo( "Enigma wants you to know:", "Please memorize or write this code down:" + k)
            y.write("nofirst" + "\n")

我一直在摆弄这一段代码大约一个星期了,现在还有几个问题:

  1. 当弹出对话框告诉你记住密钥时,每次使用不同的密钥时它会一次又一次地弹出,并且重复大约10次。

  2. 虽然它为passfile.txt添加了nofirst,但是每次按下按钮都会继续执行该功能。

    如果你们能告诉我为什么会出现这些问题并给我一个替代功能,我将不胜感激。

3 个答案:

答案 0 :(得分:0)

您不想在循环中使用pass。根据定义,该命令不起作用。当您看到break

时,请使用命令nofirst退出循环

答案 1 :(得分:0)

首先测试文件是否存在;只有在它不存在时才创建它,否则读取数据:

_here = os.path.dirname(os.path.abspath(__file__))

def create_key():    
    filename = os.path.join(_here, 'passfile.txt')
    if os.path.isfile(filename):
        # exists
        with open(filename) as passfile:
            secret = passfile.read().strip()
    else:
        # create a new key
        secret = ''.join([str(randint(1, i + 8)) for i in range(8)])
        with open(filename, 'w') as passfile:
            secret = passfile.write(secret)

你真的想在这里使用绝对文件名(完整路径),而不是依赖脚本的启动位置。这是_here变量提供的内容,即当前文件的目录名称。有了它,我们为密码文件创建一个文件名,然后您可以使用os.path.isfile()进行测试。

答案 2 :(得分:0)

这是我给你的答案,也许不是最干净的但是有效。我认为这是一个在Python中进行序列化的机会,因此这些可能不是最佳实践。

import pickle
import os

def create_key():
    #First check to see if the property files exists
    filePath = 'C:/------FILEPATH-------/'
    if os.path.exists(filePath):
        #check to see that the file is not blank
        if os.stat(filePath)[6] > 0:
            #If it is not, load the firstRun variable
            with open(filePath, 'rb') as f:
                firstRun = pickle.load(f)
        else:
            with open(filePath, 'wb') as f:
                firstRun = 't'
                pickle.dump(firstRun,f)   
    else:
        #If it does not, create the file and save the firstRun variable as true,
        #since it has to be the first run if the file doesn't exist
        with open(filePath, 'wb') as f:
            firstRun = 't'
            pickle.dump(firstRun,f)    

    if firstRun == 't':

        '''
        Put key generation code here
        '''

        #Since the key has been generated we no longer want to do this so we set
        #firstRun to false and save the property file
        with open(filePath, 'wb') as f:
            firstRun = 'f'
            pickle.dump(firstRun,f)

if __name__ == '__main__':
    create_key()      
    print('done!')