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

标签 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。抱歉,如果我犯了一些写作错误。

最佳答案

您不应在代码中使用 route,而应使用 route.get()route 在你的例子中只是一个字符串的容器,一个 StringVar 对象,所以 if 认为它是 True 。另一方面,route.get() 是一个字符串,从 Entry 中检索。因此,最终的代码可能类似于:

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

关于python - 在我输入的某些路径中保存文件时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58430815/

相关文章:

python - 将 sqlite3.cursor 转换为 int PYTHON

python - 即使使用几何管理器,按钮也未显示在 Tkinter 中

python - 我如何在pygame中删除我的 Sprite 表上的黑色背景

python - 是否基于操作系统提供 Python tkinter ttk 主题

python - 如何实现withdraw()?

python - 在 Tkinter 中动态创建函数和绑定(bind)按钮

python - 在主循环旁边运行 Tkinter 相关代码,无需 GUI 卡住

python - Numpy——二维数组中某个索引后每行的最大值

python - 在 python 上,如何确定单击了哪个按钮

python - 使用 readlines() 是比创建列表更好的方法吗?