如何获得os.path.split这样与用户定义askopenfilename工作? argparse或pathlib会更好吗?

时间:2019-02-02 21:23:01

标签: python tkinter user-input user-defined-functions argparse

我需要关于如何正确使用一些帮助os.path.split与tkinters 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” ←输入askfilename并自动完成滚动文本,在末尾添加.mdl

$体 “主体” “test.dmx” 的←只有选定的文件

$ cdmaterials “nitpick\test” 的←假定纹理是在材料中夹,而不是模型

$序列 “空闲”, “test.dmx” 环fps的30的←只有选定的文件


编辑

我发现一种叫做argparse,它的声音有前途的。我不知道这是否会帮助我,我想要做的。

还可以在scrollingtext的特定行上打印字符串吗?

2 个答案:

答案 0 :(得分:1)

在我看来,你的问题,从错误使用os.path.dirname和os.path.split这样的出现。从本质上讲,它们是互补的

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

此外,您似乎将两个参数传递给os.path.split,而根据python参考,它仅接受一个参数。

答案 1 :(得分:1)

os.path.split只有一个参数:

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

它所做的是分裂除了“文件名”部分中的“含有目录”部分,所以在这里将含目录为foo,并且文件名是bar。没有文件扩展名的概念,文件名中可以​​包含任意数量的点,例如bar.tex.txt.tar.gz就是 name bar.tex.txt.tar.gz:< / p>

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

这里没有包含目录的部分,因此为空。

Tkinter的filename = filedialog.askopenfilename()的结果似乎始终是现有文件的完整路径名(这是基于快速实验,没有任何文档; the documentation appears to be a bit thin),因此在{{1 }}你应该始终有一个非空目录部分和文件名部分。但是,如果你想要的是取代最后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

顺便说一句,pathlib对于您似乎正在做的事情来说有点笨重,但这是表达您可能要对路径进行的所有类型操作的一种便捷方法。