在我输入的某些路径中保存文件时出现问题

时间:2019-10-17 10:48:39

标签: python tkinter

当我在条目中引入路由时尝试自动创建文件时遇到问题。关键是,如果程序询问您将文件保存在哪里,它会完美地保存它,但是我希望我的程序首先保存文件(如果我在条目中指明了先前的路线),并且仅询问我要将文件保存在哪里不要输入任何特定路线(正如我所说的那样,这样做很完美)

我是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。对不起,如果我写错了。

1 个答案:

答案 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()