当我在条目中引入路由时尝试自动创建文件时遇到问题。关键是,如果程序询问您将文件保存在哪里,它会完美地保存它,但是我希望我的程序首先保存文件(如果我在条目中指明了先前的路线),并且仅询问我要将文件保存在哪里不要输入任何特定路线(正如我所说的那样,这样做很完美)
我是Python的新手,不知道自己在做什么错,也不知道问题是否在于我在代码中错误地链接了路线,并且无法识别我在哪里要求保存它。 当我引入ID和路线时,会出现此错误:
PermissionError: [Errno 13] Permission denied: 'Desktop';
而当我仅引入ID(将路由留空)时,会出现此错误:
FileNotFoundError: [Errno 2] No such file or directory: ''
我想要的是,当我仅引入一个ID时,我想问我要将文件保存在哪里。
from tkinter import *
from tkinter import filedialog
window = Tk()
window.title("app")
idcheck = StringVar()
route = StringVar()
def function():
if route:
**idchecklist = open(route, "w")**
else:
idchecklist = filedialog.asksaveasfile(mode='w',defaultextension=".txt")
idchecklist.write(idcheck.get())
idchecklist.close()
Label(window, text="ID").grid(padx=10 ,pady=10, row=0, column=0)
Entry(window, textvariable=idcheck).grid(padx=5, row=0, column=1, sticky=E+W)
Label(window, text="Saving route").grid(padx=10 ,pady=10, row=1, column=0)
Entry(window, textvariable=route, width=50).grid(padx=5, row=1, column=1)#, sticky=E+W)
Button(window, text="Generate", command=function).grid(padx=10,pady=10,row=2,column=0,columnspan=2,sticky=E+W)
window.mainloop()
最后,有什么方法可以保存我引入的路由条目,以防万一我想多次使用该程序而不必每次都引入该条目?那会很好。 非常感谢。
ps。对不起,如果我写错了。
答案 0 :(得分:0)
您不应在代码中使用route
,而应使用route.get()
。
在您的情况下,route
只是一个字符串的容器,即StringVar对象,因此if认为它是True。另一方面,route.get()
是一个字符串,可以从条目中检索。因此,最终代码可能类似于以下内容:
from tkinter import *
from tkinter import filedialog
window = Tk()
window.title("app")
idcheck = StringVar()
route = StringVar()
def function():
if route.get():
idchecklist = open(route.get(), "w")
else:
idchecklist = filedialog.asksaveasfile(mode='w',defaultextension=".txt")
idchecklist.write(idcheck.get())
idchecklist.close()
Label(window, text="ID").grid(padx=10 ,pady=10, row=0, column=0)
Entry(window, textvariable=idcheck).grid(padx=5, row=0, column=1, sticky=E+W)
Label(window, text="Saving route").grid(padx=10 ,pady=10, row=1, column=0)
Entry(window, textvariable=route, width=50).grid(padx=5, row=1, column=1)#, sticky=E+W)
Button(window, text="Generate", command=function).grid(padx=10,pady=10,row=2,column=0,columnspan=2,sticky=E+W)
window.mainloop()
如果我正确的话(请参见评论),这是更好的版本:
from tkinter import *
from tkinter import filedialog
import os
# create window
window = Tk()
window.title("app")
# create some containers for inputs
idcheck = StringVar()
route = StringVar()
# create input entrys
Label(window, text="ID").grid(padx=10 ,pady=10, row=0, column=0)
Entry(window, textvariable=idcheck).grid(padx=5, row=0, column=1, sticky=E+W)
Label(window, text="Saving route").grid(padx=10 ,pady=10, row=1, column=0)
Entry(window, textvariable=route, width=50).grid(padx=5, row=1, column=1)#, sticky=E+W)
# Update function
def function():
if route.get(): # if route is not '' then use it else ask for it
idcheckpath = route.get()
else:
idcheckpath = filedialog.askdirectory()
route.set(idcheckpath)
# create and fill the file
idchecklist = open(idcheckpath+os.sep+idcheck.get()+'.txt', 'w')
idchecklist.write(idcheck.get())
idchecklist.close()
# generate new id:
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
# get the old id and split it into a number and a string
old_id = idcheck.get()
if len(old_id) != 8:
old_id='000000AA'
letters = old_id[6:]
number = int(old_id[:6])
# check if the last letter is Z
if letters[1] == alphabet[-1]:
if letters[0] == alphabet[-1]: # if both letters are Z, update the number
letters = 'AA'
number += 1
else:
letters = alphabet[1+alphabet.find(letters[0])]+'A' # if only the last letter is Z, update both letters
else:
letters = letters[0]+alphabet[1+alphabet.find(letters[1])] # update the last letter
idcheck.set(str(number).zfill(6)+letters) # save a new id
Button(window, text="Generate", command=function).grid(padx=10,pady=10,row=2,column=0,columnspan=2,sticky=E+W)
window.mainloop()