Skip to main content

CTkFileDialog

A modern and fully customizable File Dialog for CustomTkinter — a must-have extension pack!

[!WARNING] Unfortunately parameters like video_preview or preview_img, and tooltip are not compatible with the mini dialog and will not be applied.


🚀 Features

  • 🔍 Autocomplete in the path entry field (with Tab, Up, and Down)
  • 🖼️ Live image preview
  • 🎥 Video thumbnail preview
  • 📁 Directory selection
  • 💾 Save file dialog (return path or open file)
  • ❔ Tooltip support
  • 🖥️ Shell Path Syntax Support
  • ⌨️ Backspace using Alt + Left Arrow shortcut
  • 💡 Data type validation at runtime and for static type analyzers

📦 Installation

# Using bash 
git clone https://github.com/FlickGMD/CTkFileDialog
cd CTkFileDialog
python3 -m venv .venv
source .venv/bin/activate
pip3 install -r requirements.txt

# On Windows 
git clone https://github.com/FlickGMD/CTkFileDialog 
cd CTkFileDialog
python3 -m venv .venv 
.\.venv\Scripts\activate.ps1 # In Powershell
pip3 install -r requirements.txt 

# Or ussing pip 

python3 -m venv .venv 
source .venv/bin/activate # In powershell -> .\.venv\Scripts\activate.ps1
pip3 install CTkFileDialog 

[!WARNING] You should install the Hack Nerd Fonts if u wanna see the icons without problems :)


🧪 Demo — All Methods

🗂️ Open File

import customtkinter as ctk
from CTkFileDialog import askopenfilename

ctk.set_appearance_mode("Dark")
ctk.set_default_color_theme("blue")

def open_file():
    path = askopenfilename(preview_img=True, autocomplete=True)
    if path:
        result_label.configure(text=f"Selected file:\n{path}")

app = ctk.CTk()
app.title("askopenfilename Demo")
app.geometry("500x200")

ctk.CTkButton(app, text="Open File", command=open_file).pack(pady=20)
result_label = ctk.CTkLabel(app, text="Waiting for file selection...")
result_label.pack()

app.mainloop()

🗂️ Open Multiple Files

import customtkinter as ctk
from CTkFileDialog import askopenfilenames

ctk.set_appearance_mode("Dark")
ctk.set_default_color_theme("blue")

def open_files():
    paths = askopenfilenames(preview_img=True, autocomplete=True)
    if paths:
        result_label.configure(text="Selected files:\n" + "\n".join(paths))

app = ctk.CTk()
app.title("askopenfilenames Demo")
app.geometry("500x300")

ctk.CTkButton(app, text="Open Multiple Files", command=open_files).pack(pady=20)
result_label = ctk.CTkLabel(app, text="Waiting for file selection...", wraplength=450)
result_label.pack()

app.mainloop()

📁 Select Directory

import customtkinter as ctk
from CTkFileDialog import askdirectory

ctk.set_appearance_mode("Dark")
ctk.set_default_color_theme("blue")

def select_directory():
    folder = askdirectory(autocomplete=True)
    if folder:
        result_label.configure(text=f"Selected directory:\n{folder}")

app = ctk.CTk()
app.title("askdirectory Demo")
app.geometry("500x200")

ctk.CTkButton(app, text="Select Directory", command=select_directory).pack(pady=20)
result_label = ctk.CTkLabel(app, text="Waiting for directory selection...")
result_label.pack()

app.mainloop()

💾 Save As (get path only)

import customtkinter as ctk
from CTkFileDialog import asksaveasfilename

ctk.set_appearance_mode("Dark")
ctk.set_default_color_theme("blue")

def save_as_filename():
    path = asksaveasfilename(autocomplete=True)
    if path:
        result_label.configure(text=f"Save file as:\n{path}")

app = ctk.CTk()
app.title("asksaveasfilename Demo")
app.geometry("500x200")

ctk.CTkButton(app, text="Save As (Filename Only)", command=save_as_filename).pack(pady=20)
result_label = ctk.CTkLabel(app, text="Waiting for filename...")
result_label.pack()

app.mainloop()

💾 Save As (write to file)

import customtkinter as ctk
from CTkFileDialog import asksaveasfile

ctk.set_appearance_mode("Dark")
ctk.set_default_color_theme("blue")

def save_as_file():
    file = asksaveasfile(autocomplete=True)
    if file:
        file.write("This file was created using the demo.")
        file.close()
        result_label.configure(text=f"File saved:\n{file.name}")

app = ctk.CTk()
app.title("asksaveasfile Demo")
app.geometry("500x200")

ctk.CTkButton(app, text="Save As (Real File)", command=save_as_file).pack(pady=20)
result_label = ctk.CTkLabel(app, text="Waiting for save location...")
result_label.pack()

app.mainloop()

🧩 Parameters

Parameter Description
hidden Show hidden files or directories (False by default).
preview_img Enable image preview in the file dialog.
video_preview Show first frame of video files as thumbnail (experimental).
autocomplete Enable path autocompletion with Tab, Up, and Down.
initial_dir Set the initial directory when opening the dialog.
tool_tip Enable the tool tip.
style Defines the dialog style, by default it will be 'Default' but you can choose a small one ('Mini')
geometry You define the geometry string in a tuple: Example ('NormalGM', 'MiniGeometry')
title Define the title from the app, default will be "CTkFileDialog"

🌙 Dark Mode Preview

☀️ Light Mode Preview


Package constants

This module has constants that can be used outside or inside the dialog, they are used to obtain paths like /home/user or /home/user/.config/ Here is a basic example

#!/usr/bin/env python3 
import customtkinter as ctk 
from CTkFileDialog import askopenfilename
from CTkFileDialog.Constants import HOME

root = ctk.CTk()

def open_file(): 
    f = askopenfilename(initial_dir=HOME, autocomplete=True)
    if f: 
        print(f"file selected: {f}")

ctk.CTkButton(master=root, command=open_file, text="Open File").pack(padx=10, pady=10, anchor=ctk.CENTER)

root.mainloop()

And here are the constants available from the package

Parameter Description
PWD Current working directory (e.g., where the program was launched)
HOME User's home directory (e.g., /home/user or C:\Users\user)
TEMP Temporary directory (fallback to /tmp if no env vars are set)
CONFIG_DIR XDG-compliant user configuration directory (default: ~/.config)
CACHE_DIR XDG-compliant user cache directory (default: ~/.cache)
PATH System PATH split into a list of directories
DATA_DIR XDG-compliant user data directory (default: ~/.local/share)
VENV Active Python virtual environment (venv or conda), fallback to PWD

Mini Dialog

This is a parameter of the file dialog, but it's more powerful than the default one. As I mentioned earlier, it doesn't support parameters like tooltip, preview_img, or video_preview.

🌙 Dark Mode Preview

☀️ Light Mode Preview

The mini design wasn't created by me; it was created by this user, and all credit goes to him. I also want to thank him for creating that design in advance.


👨‍💻 Under Development

This tool is actively under development.
If you have any ideas, bugs, or requests — feel free to contribute!


🔗 Repository

👉 GitHub Repo

This tool is under development, I hope you like it!

Metadata

Release files for CTkFileDialog 0.3.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for CTkFileDialog 0.3.3
File Size Uploaded
ctkfiledialog-0.3.3.tar.gz 311.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for CTkFileDialog 0.3.3
File Interpreter ABI Platform
ctkfiledialog-0.3.3-py3-none-any.whl Python 3 none any Details

Total release size: 534.0 kB

Release files / ctkfiledialog-0.3.3.tar.gz

Download URL ctkfiledialog-0.3.3.tar.gz
Size 311.3 kB
Tags Source
SHA-256 checksum
How to use checksums
47d2f33e47cd986c62c92fcee5aa3feb1924520d232e37dbd447caefb91e7fb2
BLAKE2b-256 checksum
How to use checksums
3e3c0f2503f72c279fcec5ee6e5619bbf816412d4047cf7817cf1a3beca44101
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.2

Release files / ctkfiledialog-0.3.3-py3-none-any.whl

Download URL ctkfiledialog-0.3.3-py3-none-any.whl
Size 222.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1511c7e47374af76c098059d5d7cb2ed51115030f97d0b208a1fb47f0a9a01ba
BLAKE2b-256 checksum
How to use checksums
10b505bcde7cb1b72ec6ab1e69f7b2a6d65d52a97f4b358b2c4ece1fd58f6816
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.2

Release history Release notifications | RSS feed

This release

0.3.3 This release

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.9

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page