Skip to main content

tkinter-unblur

PyPI version PyPI Downloads Python versions Type checked CI License

Note: hdpitkinter has been reborn as tkinter-unblur with modern features. See migration guide.

Fix blurry Tkinter applications on Windows 10/11 high-DPI displays.

The Problem

Tkinter applications look blurry and pixelated on modern high-resolution displays with scaling enabled (125%, 150%, 200%, etc.). This is because Tkinter is not DPI-aware by default on Windows.

The Solution

# Before (blurry)
from tkinter import Tk

# After (crystal clear)
from tkinter_unblur import Tk

That's it. One import change, and your Tkinter app renders sharply.

Visual Comparison

Blurry vs Sharp Comparison

Left: Standard Tkinter (blurry) | Right: tkinter-unblur (sharp)

Installation

pip install tkinter-unblur

Usage

from tkinter_unblur import Tk

root = Tk()
root.title("My App")
root.geometry("800x600")
root.mainloop()

That's all you need! For advanced usage, see API Reference.

API Reference

Tk Class

A drop-in replacement for tkinter.Tk with DPI awareness.

Attributes

  • dpi_x: int | None - Horizontal DPI (96 = 100% scaling)
  • dpi_y: int | None - Vertical DPI (96 = 100% scaling)
  • dpi_scaling: float - Scaling factor (1.0 = 100%, 1.5 = 150%)

Example:

root = Tk()
print(f"DPI: {root.dpi_x}x{root.dpi_y}")
print(f"Scaling: {root.dpi_scaling:.0%}")  # e.g., "Scaling: 150%"

Methods

scale_value(value: int) -> int

Scale a numeric value by the DPI factor.

Example:

from tkinter import Label

root = Tk()
# Scale font size to maintain physical size across different DPI settings
label = Label(root, text="Hello", font=("Arial", root.scale_value(12)))
scale_geometry(geometry: str) -> str

Scale a geometry string ("WxH+X+Y") by the DPI factor.

Example:

root = Tk()
# Scale window geometry (width x height + x + y)
root.geometry(root.scale_geometry("800x600+100+50"))

Exceptions

  • TkinterUnblurError - Base exception
  • UnsupportedPlatformError - Platform doesn't support DPI awareness
  • DPIDetectionError - DPI detection failed

How It Works

On Windows, this library:

  1. Calls SetProcessDpiAwareness(1) to enable system DPI awareness
  2. Queries the monitor's DPI using GetDpiForMonitor
  3. Provides scaling utilities for your application

On non-Windows platforms, the library is a simple passthrough to tkinter.Tk.

The implementation is based on this Stack Overflow answer.

Compatibility

Platform Status
Windows 10/11 Full DPI awareness support
Linux Passthrough (OS handles DPI)
macOS Passthrough (OS handles DPI)
Python Version Status
3.9 - 3.14 Supported
3.8 Not supported (EOL)

Migrating from hdpitkinter

This package was formerly known as hdpitkinter. To migrate:

pip uninstall hdpitkinter
pip install tkinter-unblur
# Old
from hdpitkinter import HdpiTk
root = HdpiTk()

# New
from tkinter_unblur import Tk
root = Tk()

The HdpiTk name is still available as an alias for backwards compatibility:

from tkinter_unblur import HdpiTk  # Works, but Tk is preferred

License

MIT License - see LICENSE for details.

Metadata

Release files for tkinter-unblur 2.0.1

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

Source distribution (sdist)

Source distribution for tkinter-unblur 2.0.1
File Size Uploaded
tkinter_unblur-2.0.1.tar.gz 13.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for tkinter-unblur 2.0.1
File Interpreter ABI Platform
tkinter_unblur-2.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 23.4 kB

Release files / tkinter_unblur-2.0.1.tar.gz

Download URL tkinter_unblur-2.0.1.tar.gz
Size 13.7 kB
Tags Source
SHA-256 checksum
How to use checksums
e7f52828c0e8124f62b9ed7c84b80cc0e39834fa000318786e661b1e178c122b
BLAKE2b-256 checksum
How to use checksums
e7c4945331755a9d15df69328e9cbdacc2537cbb3dd8bdc5affb9a809e68ddff
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 15, 2025.

Transparency log

Release files / tkinter_unblur-2.0.1-py3-none-any.whl

Download URL tkinter_unblur-2.0.1-py3-none-any.whl
Size 9.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6767b581a8c2c559ca3fc2404b85c9bf6cde763399aca43d888885e66b157bbd
BLAKE2b-256 checksum
How to use checksums
04ee5ed8eee63da2db1e3a3ffbb1b500193dd823d1f7dac6355d48c4be591507
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Dec 15, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

2.0.1 This release

2 release files

2.0.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