Linux X环境下Tkinter错误屏幕DPI的信息来源咨询
Tkinter在Linux X环境下返回错误DPI的原因
Tkinter返回的96左右DPI并非"错误",而是它读取的是X11的逻辑DPI,而非真实物理DPI,具体来源如下:
- 依赖X11默认逻辑DPI:Tkinter底层基于Xlib实现,它获取DPI时不会计算屏幕物理尺寸与像素的比值,而是读取X11系统的逻辑DPI配置。这个值默认设为96,是多年前为兼容旧应用定下的标准,匹配早期CRT屏幕的常用DPI。
- 未读取真实物理参数:你通过xrandr计算的真实DPI,是结合显示器物理尺寸(从EDID获取)和像素分辨率得出的,但Tkinter的
winfo_fpixels接口不会主动读取EDID里的物理尺寸信息,也不会执行该计算。 - 受系统缩放配置影响:如果用户在桌面环境中手动设置了缩放比例(比如通过
Xft.dpi环境变量或桌面设置面板),Tkinter会读取配置后的DPI值;但如果没有手动设置,就会 fallback 到默认的96 DPI。
验证代码格式化
import tkinter as tk root = tk.Tk() print(root.winfo_fpixels('1i')) root.destroy() # 通过xrandr计算真实DPI import subprocess xrandr_out = subprocess.check_output(['xrandr']).decode().splitlines() xy_in = [int(mm[:-2])/25.4 for mm in xrandr_out[1][-13:].split(' x ')] xy_pix = [int(pixels) for pixels in xrandr_out[2].split()[0].split('x')] dpi_x, dpi_y = [pixels/dimension for pixels, dimension in zip(xy_pix, xy_in)] print(dpi_x, dpi_y)
输出:
96.08406304728547 185.35135135135135 185.66497461928932
内容的提问来源于stack exchange,提问作者gboffi
相关产品推荐
相关产品推荐

