Есть ли способ указать, а затем открыть файл с помощью Python? - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь создать программу, которая позволит пользователю выбрать файл со своего компьютера и затем открыть его.Я пытался сделать это с Python, и ...

filedialog.askopenfilenames()

... с этим виджетом Tkinter.

Я могу получить путь к файлу из этого успешно, но какЯ использую это, чтобы фактически открыть файл?(Я пытаюсь открыть его в приложении по умолчанию, а не просто распечатать его на консоли Python.) Я пытался использовать

from subprocess import call
call(['xdg-open','filename'])

с «файлами» (переменная, в которой хранится имя файла), заменяя 'filename', но я получаю следующую ошибку:

Traceback (most recent call last):
  File "/Users/charlierubinstein/Documents/Search Engine.py", line 9, in <module>
    call(['xdg-open', files])
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/subprocess.py", line 267, in call
    with Popen(*popenargs, **kwargs) as p:
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/subprocess.py", line 709, in __init__
    restore_signals, start_new_session)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/subprocess.py", line 1275, in _execute_child
    restore_signals, start_new_session, preexec_fn)
TypeError: expected str, bytes or os.PathLike object, not tuple

мой код:

from tkinter import *
from tkinter import ttk
from tkinter import filedialog
from subprocess import call


files = filedialog.askopenfilenames()

call(['xdg-open', files])  
window.mainloop()

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

1 Ответ

1 голос
/ 15 апреля 2019

Вы используете askopenfilenames()s в конце имени)

Он позволяет вам выбрать много файлов, поэтому он возвращает кортеж со всеми выбранными файлами - даже если вы выбрали только одинfile
(или пустой кортеж, если вы отмените выбор)

Таким образом, вы должны получить первый элемент из кортежа

call(['xdg-open', files[0] ])  

Или использовать askopenfilename() (без s в конце имени), и вы получите одну строку.

filename = filedialog.askopenfilename() # without `s` at the end

call(['xdg-open', filename])  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...