正如标题所说,我需要一个仅在您第一次使用该程序时运行的功能。我正在制作一个密码管理器,这个功能是为用户创建一个独特的加密密钥,这将使我的密码牢不可破。我使用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")
我一直在摆弄这一段代码大约一个星期了,现在还有几个问题:
当弹出对话框告诉你记住密钥时,每次使用不同的密钥时它会一次又一次地弹出,并且重复大约10次。
虽然它为passfile.txt添加了nofirst,但是每次按下按钮都会继续执行该功能。
如果你们能告诉我为什么会出现这些问题并给我一个替代功能,我将不胜感激。
答案 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!')