TheDeveloperNextDoor
TheDeveloperNextDoor

Reputation: 195

Is there a way to specify and then open a file with Python?

I'm attempting to make a program which will allow the user to pick a file from their computer and then open it. I've been trying to do this with Python, and...

filedialog.askopenfilenames()

...with this Tkinter widget.

I can get the filepath from this successfully, but how to I use it to actually open the file? (I'm trying to open it in its default app, not just print it to the Python console.) I've tried using

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

with 'files' (the variable that the filename is stored in) replacing 'filename', but I get the following error:

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

my code so far:

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


files = filedialog.askopenfilenames()

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

As stated earlier, ideally this program would let the user pick a file, and then open that file in its default app.

Upvotes: 0

Views: 100

Answers (1)

furas
furas

Reputation: 142681

You use askopenfilenames() (with s at the end of name)

It let you select many files so it returns tuple with all selected files - even if you selected only one file
(or empty tuple if you cancel selection)

So you have to get first element from tuple

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

Or use askopenfilename() (without s at the end of name) and you will get single string.

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

call(['xdg-open', filename])  

Upvotes: 1

Related Questions