🎥 Watch the Main Demo Video on GitHub
✨ Features
| Feature | Description |
|---|---|
| ⚡ Live Updates | Stream and display real-time data continuously |
| 📉 Multiple Lines | Plot several lines on the same chart for easy comparison |
| 🎨 Color Customization | Tailor colors to match your app's design |
| 🌓 Dynamic Theme | Dynamic color change for dark & light themes |
| 🔤 Font Customization | Adjust text fonts for better readability |
| 📐 Dimension Control | Resize charts to fit any layout |
| 🎛️ Granular Config | Fine-grained control via configure_*() methods (v2.2.0+) |
📦 Installation
pip install ctkchart
import ctkchart
🚀 Quick Start
import customtkinter as ctk
import ctkchart
import random
import threading
import time
root = ctk.CTk()
# 1. Create the chart
chart = ctkchart.CTkLineChart(
master=root,
x_axis_values=("a", "b", "c", "d", "e", "f"),
y_axis_values=(100, 900)
)
chart.place(x=10, y=10)
# 2. Create a line
line = ctkchart.CTkLine(master=chart)
# 3. Stream data in a background thread
def loop():
while True:
chart.show_data(line=line, data=[random.choice(range(100, 900))])
time.sleep(1)
threading.Thread(target=loop, daemon=True).start()
root.mainloop()
🎬 Live Examples
1 — Simple
▶️ View Simple Demo Video on GitHub
View code
import customtkinter as ctk
import ctkchart
import random
import threading
import time
root = ctk.CTk()
root.configure(fg_color="#0d1117")
root.geometry("720x430+200+200")
line_chart = ctkchart.CTkLineChart(
master=root,
x_axis_values=("01-01", "01-02", "01-03", "01-04", "01-05", "01-06", "01-07", "01-08", "01-09", "01-10"),
y_axis_values=(0, 1000)
)
line_chart.pack(pady=15)
line = ctkchart.CTkLine(master=line_chart)
def display_data():
while True:
line_chart.show_data(line=line, data=[random.choice(range(0, 1000))])
time.sleep(0.5)
threading.Thread(target=display_data, daemon=True).start()
root.mainloop()
2 — Styled & Filled Line
▶️ View Styled & Filled Line Demo Video on GitHub
View code
import customtkinter as ctk
import ctkchart
import random
import threading
import time
root = ctk.CTk()
root.configure(fg_color="#0d1117")
root.geometry("720x430+200+200")
line_chart = ctkchart.CTkLineChart(
master=root,
x_axis_values=("01-01", "01-02", "01-03", "01-04", "01-05", "01-06", "01-07", "01-08", "01-09", "01-10"),
y_axis_values=(0, 1000),
y_axis_label_count=10,
)
line_chart.pack(pady=15)
line = ctkchart.CTkLine(
master=line_chart,
size=2,
fill="enabled"
)
def display_data():
while True:
line_chart.show_data(line=line, data=[random.choice(range(0, 1000))])
time.sleep(0.5)
threading.Thread(target=display_data, daemon=True).start()
root.mainloop()
3 — 2 Lines with Different Styles
▶️ View 2 Lines Demo Video on GitHub
View code
import customtkinter as ctk
import ctkchart
import random
import threading
import time
root = ctk.CTk()
root.configure(fg_color=("#ffffff", "#0d1117"))
root.geometry("720x430+200+200")
line_chart = ctkchart.CTkLineChart(
master=root,
x_axis_values=("01-01", "01-02", "01-03", "01-04", "01-05", "01-06", "01-07", "01-08", "01-09", "01-10"),
y_axis_values=(0, 1000),
y_axis_label_count=10,
)
line_chart.pack(pady=15)
line1 = ctkchart.CTkLine(
master=line_chart,
color=("#5dffb6", "#5dffb6"),
size=2,
style="dashed",
style_type=(10, 5),
)
line2 = ctkchart.CTkLine(
master=line_chart,
color=("#FFBAD2", "#FFBAD2"),
size=2,
point_highlight="enabled",
point_highlight_color=("#FFBAD2", "#FFBAD2"),
)
def display_data():
while True:
line_chart.show_data(line=line1, data=[random.choice(range(0, 1000))])
line_chart.show_data(line=line2, data=[random.choice(range(0, 1000))])
time.sleep(0.5)
threading.Thread(target=display_data, daemon=True).start()
root.mainloop()
4 — 3 Lines with Different Styles
▶️ View 3 Lines Demo Video on GitHub
View code
import customtkinter as ctk
import ctkchart
import random
import threading
import time
root = ctk.CTk()
root.configure(fg_color=("#ffffff", "#0d1117"))
root.geometry("720x430+200+200")
line_chart = ctkchart.CTkLineChart(
master=root,
x_axis_values=("01-01", "01-02", "01-03", "01-04", "01-05", "01-06", "01-07", "01-08", "01-09", "01-10"),
y_axis_values=(0, 1000),
y_axis_label_count=10,
)
line_chart.pack(pady=15)
line1 = ctkchart.CTkLine(master=line_chart, size=2, fill="enabled")
line2 = ctkchart.CTkLine(
master=line_chart,
color=("#5dffb6", "#5dffb6"),
size=2,
style="dashed",
style_type=(10, 5),
)
line3 = ctkchart.CTkLine(
master=line_chart,
color=("#FFBAD2", "#FFBAD2"),
size=2,
point_highlight="enabled",
point_highlight_color=("#FFBAD2", "#FFBAD2"),
)
def display_data():
while True:
line_chart.show_data(line=line1, data=random.choices(range(0, 1000), k=1))
line_chart.show_data(line=line2, data=random.choices(range(0, 1000), k=1))
line_chart.show_data(line=line3, data=random.choices(range(0, 1000), k=1))
time.sleep(0.5)
threading.Thread(target=display_data, daemon=True).start()
root.mainloop()
5 — With Grid Sections
▶️ View Grid Sections Demo Video on GitHub
View code
import customtkinter as ctk
import ctkchart
import random
import threading
import time
root = ctk.CTk()
root.configure(fg_color=("#ffffff", "#0d1117"))
root.geometry("720x430+200+200")
line_chart = ctkchart.CTkLineChart(
master=root,
x_axis_values=("01-01", "01-02", "01-03", "01-04", "01-05", "01-06", "01-07", "01-08", "01-09", "01-10"),
y_axis_values=(0, 1000),
y_axis_label_count=10,
y_axis_section_count=10,
x_axis_section_count=10,
)
line_chart.pack(pady=15)
line1 = ctkchart.CTkLine(
master=line_chart,
color=("#5dffb6", "#5dffb6"),
size=2,
style="dashed",
style_type=(10, 5),
)
line2 = ctkchart.CTkLine(
master=line_chart,
color=("#FFBAD2", "#FFBAD2"),
size=2,
point_highlight="enabled",
point_highlight_color=("#FFBAD2", "#FFBAD2"),
)
def display_data():
while True:
line_chart.show_data(line=line1, data=[random.choice(range(0, 1000))])
line_chart.show_data(line=line2, data=[random.choice(range(0, 1000))])
time.sleep(0.5)
threading.Thread(target=display_data, daemon=True).start()
root.mainloop()
6 — Light and Dark theme
For every parameter that involves color in ctkchart, you can provide either:
- A single string representing the color.
- A tuple of two strings where the first string represents the color for the light theme and the second string represents the color for the dark theme.
▶️ View Dynamic Theme Demo Video on GitHub
📚 Documentation
Explore all parameters, configuration methods, and advanced usage:
👥 Contributors
Metadata
Release files for ctkchart 2.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| ctkchart-2.2.1.tar.gz | 35.7 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ctkchart-2.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 69.8 kB
Release files / ctkchart-2.2.1.tar.gz
| Download URL | ctkchart-2.2.1.tar.gz |
|---|---|
| Size | 35.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
849b42c65152f66d216dad67d025a620705db4b8c9897d4a6448e6bae9b6e0d6
|
|
BLAKE2b-256 checksum How to use checksums |
445c07b7d3c8730118422738c9e0a1c420f3025fe551932036f709e81f727cf5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|
Release files / ctkchart-2.2.1-py3-none-any.whl
| Download URL | ctkchart-2.2.1-py3-none-any.whl |
|---|---|
| Size | 34.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e20fd326945b124be91d4a337eea04805078ce944af7439d26316dea08b0c27a
|
|
BLAKE2b-256 checksum How to use checksums |
17f42ba23c3ed1d24d15612be7267f8c65902bab3104ffe1f81094e488a571bf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.10
|
Security for ctkchart 2.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.