Проблема при сохранении файла по определенному маршруту, который я вхожу - PullRequest
1 голос
/ 17 октября 2019

У меня проблема при попытке автоматически создать файл при вводе маршрута в запись. Дело в том, что если программа спросит вас, где ее сохранить, она прекрасно ее сохранит, но мне бы хотелось, чтобы моя программа сначала сохраняла файл, если я указываю предыдущий маршрут в записи и ТОЛЬКО спрашиваю, где я хочу сохранить его, если яне вводите какой-либо конкретный маршрут (который, как я уже сказал, делает это отлично)

Я новичок в Python и не знаю, что я делаю неправильно, не знаю, в чем проблемаЯ неправильно связываю маршрут в коде, и он не может распознать, куда я его прошу сохранить. Когда я ввожу идентификатор и маршрут, он выдает эту ошибку:

PermissionError: [Errno 13] Permission denied: 'Desktop';

, а когда я ТОЛЬКО представляю идентификатор (оставляя маршрут пустым), он выдает эту ошибку:

FileNotFoundError: [Errno 2] No such file or directory: ''

и я хочу, чтобы, когда я только вводил идентификатор, я хотел бы спросить меня, где я хочу сохранить этот файл.

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

В заключение, есть ли способсохранить маршрут Запись, которую я ввел на всякий случай, если я хочу использовать программу более одного раза, и вам не нужно вводить эту запись каждый раз? Было бы здорово. Большое вам спасибо.

пс. Извините, если я сделал несколько ошибок в написании.

1 Ответ

0 голосов
/ 17 октября 2019

Вы не должны использовать 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()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...