Как мне получить файл os.path.split для работы с определенным пользователем askopenfilename?Будет ли argparse или pathlib работать лучше? - PullRequest
0 голосов
/ 03 февраля 2019

Мне нужна помощь, как правильно использовать os.path.split с ткинтерами scrolledtext.

Я пытался использовать split с деталями (голова / хвост) по-разному, но понятия не имеюкак заставить это работать.Главным образом о том, как вывести его в виде строкового текста, который можно изменять и обновлять при вводе пользователем.Это будет следующим в списке, но сейчас мне нужно заставить эту split часть работать.

from tkinter import filedialog, Tk, Button, Label, Grid, Entry,
scrolledtext
from os import path
import os

# FUNCTIONS

def browseFunc():
    filename = filedialog.askopenfilename()
    dirname = os.path.dirname(os.path.split(usermod, filename))
    pathlabel.config(text='current path %s' % dirname)

# START

root = Tk()

# BROWSE BUTTON

browseButton = Button (root, text="Browse", command=browseFunc)
browseButton.grid(row=0, column=0)

# BROWSE BUTTON OUTPUT

pathlabel = Label(root)
pathlabel.grid(row=0, column=1)

# END
root.mainloop()

Если tkinter не подходит для того, что яхочу, дайте мне знать.

Вход

Пользователь : выберите файл → H:\SteamLibrary\SteamApps\common\SourceFilmmaker\game\usermod\models\nitpick\test\test.dmx

Выход

прокручиваемый текст :

$ modelname "nitpick\test\test .mdl" ← принимает ввод имени файла имени и автоматически завершает прокручиваемый текст, добавляет .mdl в конце

$ body "body" "test.dmx" ← только выбранный файл

$ cdmaterials "nitpick\test" ← при условии, что текстуры находятся в папке материалова не модели

$ sequence "idle" "test.dmx" loop fps 30 ← только выбранный файл


Правка

Я нашел что-то под названием argparse, что звучит многообещающе.Я не знаю, поможет ли это мне в том, что я пытаюсь сделать.

Также есть способ напечатать строку в определенной строке scrollingtext?

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

os.path.split принимает только один аргумент:

>>> os.path.split('foo/bar')
('foo', 'bar')

Все, что он делает, это разделяет часть «содержащая директория» от части «имя файла», поэтому здесь директория, содержащая foo, иимя файла bar.Не существует понятия расширения имени файла - имена файлов могут содержать любое количество точек, и, например, bar.tex.txt.tar.gz это просто имя bar.tex.txt.tar.gz:

>>> os.path.split('bar.tex.txt.tar.gz')
('', 'bar.tex.txt.tar.gz')

Здесь нет директивной части, поэтому она пуста.

Результат filename = filedialog.askopenfilename(), полученный от Tkinter, всегда представляет собой полный путь к существующему файлу (он основан на быстром эксперименте, а не на любомдокументация; документация выглядит немного тонкой ), поэтому после os.path.split у вас всегда должна быть непустая часть каталога и часть имени файла.Однако, если все, что вам нужно, это заменить окончательное расширение .abc на .def, попробуйте сделать это, вообще не вызывая os.path.split:

>>> filename = 'some arbitrary/name.with.dots/ending with foo.abc'
>>> os.path.splitext(filename)[0] + '.def'
'some arbitrary/name.with.dots/ending with foo.def'

Если вы хотите ограничить сопоставляемые расширенияВы можете сделать это с аргументом filedialog.askopenfilename().Документация подразумевает, что filedialog.askopenfilename() возвращает пустую строку, если пользователь нажимает «отменить».Тем не менее, это похоже на истину только после хотя бы одного успешного выбора : вместо этого он возвращает пустой кортеж для самого первого "отмены".Так что, кажется, лучше всего проверить это с помощью if not filename:

def browseFunc():
    filename = filedialog.askopenfilename(title='select a file',
                                          filetypes=(('py', '*.py'),
                                                     ('all', '*')))
    if not filename:
        pathlabel.config(text='no path, you chose Cancel')
    else:
        pathlabel.config(text='current path {!r}'.format(filename))

Кстати, pathlib немного тяжеловесно для того, что вы делаете, но это удобный способвыразите все виды манипуляций, которые вы можете когда-либо делать с путями.

0 голосов
/ 03 февраля 2019

Мне кажется, что ваша проблема возникает из-за неправильного использования os.path.dirname и os.path.split.Они дополняют друг друга в том смысле, что в основном

os.path.dirname(path) = os.path.split(path)[0]

Далее вы, кажется, передаете два аргумента в os.path.split, в то время как согласно ссылке на python он принимает только один аргумент.

...