Choosing a file in Python with simple Dialog
Question:
I would like to get file path as input in my Python console application.
Currently I can only ask for full path as an input in the console.
Is there a way to trigger a simple user interface where users can select file instead of typing the full path?
Answers:
In Python 2 use the tkFileDialog
module.
import tkFileDialog
tkFileDialog.askopenfilename()
In Python 3 use the tkinter.filedialog
module.
import tkinter.filedialog
tkinter.filedialog.askopenfilename()
How about using tkinter?
from Tkinter import Tk # from tkinter import Tk for Python 3.x
from tkinter.filedialog import askopenfilename
Tk().withdraw() # we don't want a full GUI, so keep the root window from appearing
filename = askopenfilename() # show an "Open" dialog box and return the path to the selected file
print(filename)
Done!
With EasyGui:
import easygui
print(easygui.fileopenbox())
To install:
pip install easygui
Demo:
import easygui
easygui.egdemo()
Python 3.x version of Etaoin’s answer for completeness:
from tkinter.filedialog import askopenfilename
filename = askopenfilename()
Another option to consider is Zenity: http://freecode.com/projects/zenity.
I had a situation where I was developing a Python server application (no GUI component) and hence didn’t want to introduce a dependency on any python GUI toolkits, but I wanted some of my debug scripts to be parameterized by input files and wanted to visually prompt the user for a file if they didn’t specify one on the command line. Zenity was a perfect fit. To achieve this, invoke “zenity –file-selection” using the subprocess module and capture the stdout. Of course this solution isn’t Python-specific.
Zenity supports multiple platforms and happened to already be installed on our dev servers so it facilitated our debugging/development without introducing an unwanted dependency.
I obtained much better results with wxPython than tkinter, as suggested in this answer to a later duplicate question:
https://stackoverflow.com/a/9319832
The wxPython version produced the file dialog that looked the same as the open file dialog from just about any other application on my OpenSUSE Tumbleweed installation with the xfce desktop, whereas tkinter produced something cramped and hard to read with an unfamiliar side-scrolling interface.
Here is a simple function to show a file chooser right in the terminal window.
This method supports selecting multiple files or directories. This has the added benefit of running even in an environment where GUI is not supported.
from os.path import join,isdir
from pathlib import Path
from enquiries import choose,confirm
def dir_chooser(c_dir=getcwd(),selected_dirs=None,multiple=True) :
'''
This function shows a file chooser to select single or
multiple directories.
'''
selected_dirs = selected_dirs if selected_dirs else set([])
dirs = { item for item in listdir(c_dir) if isdir(join(c_dir, item)) }
dirs = { item for item in dirs if join(c_dir,item) not in selected_dirs and item[0] != "." } # Remove item[0] != "." if you want to show hidde
options = [ "Select This directory" ]
options.extend(dirs)
options.append("⬅")
info = f"You have selected : n {','.join(selected_dirs)} n" if len(selected_dirs) > 0 else "n"
choise = choose(f"{info}You are in {c_dir}", options)
if choise == options[0] :
selected_dirs.add(c_dir)
if multiple and confirm("Do you want to select more folders?") :
return get_folders(Path(c_dir).parent,selected_dirs,multiple)
return selected_dirs
if choise == options[-1] :
return get_folders(Path(c_dir).parent,selected_dirs,multiple)
return get_folders(join(c_dir,choise),selected_dirs,multiple)
To install enquiers do,
pip install enquiries
This worked for me
Reference : https://www.youtube.com/watch?v=H71ts4XxWYU
import tkinter as tk
from tkinter import filedialog
root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename()
print(file_path)
I resolved all problem related to
from tkinter import * from tkinter import filedialog
by just migrating from pycharm IDE to visual studio code IDE and every problem is solved.
The suggested root.withdraw()
(also here) hides the window instead of deleting it, and was causing problems when using interactive console in VS Code ("duplicate execution" error).
Below two snippets to return the file path in "Open" or "Save As" (python 3 on Windows):
import tkinter as tk
from tkinter import filedialog
filetypes = (
('Text files', '*.TXT'),
('All files', '*.*'),
)
# open-file dialog
root = tk.Tk()
filename = tk.filedialog.askopenfilename(
title='Select a file...',
filetypes=filetypes,
)
root.destroy()
print(filename)
# save-as dialog
root = tk.Tk()
filename = tk.filedialog.asksaveasfilename(
title='Save as...',
filetypes=filetypes,
defaultextension='.txt'
)
root.destroy()
print(filename)
# filename == 'path/to/myfilename.txt' if you type 'myfilename'
# filename == 'path/to/myfilename.abc' if you type 'myfilename.abc'
I would like to get file path as input in my Python console application.
Currently I can only ask for full path as an input in the console.
Is there a way to trigger a simple user interface where users can select file instead of typing the full path?
In Python 2 use the tkFileDialog
module.
import tkFileDialog
tkFileDialog.askopenfilename()
In Python 3 use the tkinter.filedialog
module.
import tkinter.filedialog
tkinter.filedialog.askopenfilename()
How about using tkinter?
from Tkinter import Tk # from tkinter import Tk for Python 3.x
from tkinter.filedialog import askopenfilename
Tk().withdraw() # we don't want a full GUI, so keep the root window from appearing
filename = askopenfilename() # show an "Open" dialog box and return the path to the selected file
print(filename)
Done!
With EasyGui:
import easygui
print(easygui.fileopenbox())
To install:
pip install easygui
Demo:
import easygui
easygui.egdemo()
Python 3.x version of Etaoin’s answer for completeness:
from tkinter.filedialog import askopenfilename
filename = askopenfilename()
Another option to consider is Zenity: http://freecode.com/projects/zenity.
I had a situation where I was developing a Python server application (no GUI component) and hence didn’t want to introduce a dependency on any python GUI toolkits, but I wanted some of my debug scripts to be parameterized by input files and wanted to visually prompt the user for a file if they didn’t specify one on the command line. Zenity was a perfect fit. To achieve this, invoke “zenity –file-selection” using the subprocess module and capture the stdout. Of course this solution isn’t Python-specific.
Zenity supports multiple platforms and happened to already be installed on our dev servers so it facilitated our debugging/development without introducing an unwanted dependency.
I obtained much better results with wxPython than tkinter, as suggested in this answer to a later duplicate question:
https://stackoverflow.com/a/9319832
The wxPython version produced the file dialog that looked the same as the open file dialog from just about any other application on my OpenSUSE Tumbleweed installation with the xfce desktop, whereas tkinter produced something cramped and hard to read with an unfamiliar side-scrolling interface.
Here is a simple function to show a file chooser right in the terminal window.
This method supports selecting multiple files or directories. This has the added benefit of running even in an environment where GUI is not supported.
from os.path import join,isdir
from pathlib import Path
from enquiries import choose,confirm
def dir_chooser(c_dir=getcwd(),selected_dirs=None,multiple=True) :
'''
This function shows a file chooser to select single or
multiple directories.
'''
selected_dirs = selected_dirs if selected_dirs else set([])
dirs = { item for item in listdir(c_dir) if isdir(join(c_dir, item)) }
dirs = { item for item in dirs if join(c_dir,item) not in selected_dirs and item[0] != "." } # Remove item[0] != "." if you want to show hidde
options = [ "Select This directory" ]
options.extend(dirs)
options.append("⬅")
info = f"You have selected : n {','.join(selected_dirs)} n" if len(selected_dirs) > 0 else "n"
choise = choose(f"{info}You are in {c_dir}", options)
if choise == options[0] :
selected_dirs.add(c_dir)
if multiple and confirm("Do you want to select more folders?") :
return get_folders(Path(c_dir).parent,selected_dirs,multiple)
return selected_dirs
if choise == options[-1] :
return get_folders(Path(c_dir).parent,selected_dirs,multiple)
return get_folders(join(c_dir,choise),selected_dirs,multiple)
To install enquiers do,
pip install enquiries
This worked for me
Reference : https://www.youtube.com/watch?v=H71ts4XxWYU
import tkinter as tk
from tkinter import filedialog
root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename()
print(file_path)
I resolved all problem related to
from tkinter import * from tkinter import filedialog
by just migrating from pycharm IDE to visual studio code IDE and every problem is solved.
The suggested root.withdraw()
(also here) hides the window instead of deleting it, and was causing problems when using interactive console in VS Code ("duplicate execution" error).
Below two snippets to return the file path in "Open" or "Save As" (python 3 on Windows):
import tkinter as tk
from tkinter import filedialog
filetypes = (
('Text files', '*.TXT'),
('All files', '*.*'),
)
# open-file dialog
root = tk.Tk()
filename = tk.filedialog.askopenfilename(
title='Select a file...',
filetypes=filetypes,
)
root.destroy()
print(filename)
# save-as dialog
root = tk.Tk()
filename = tk.filedialog.asksaveasfilename(
title='Save as...',
filetypes=filetypes,
defaultextension='.txt'
)
root.destroy()
print(filename)
# filename == 'path/to/myfilename.txt' if you type 'myfilename'
# filename == 'path/to/myfilename.abc' if you type 'myfilename.abc'