В Windows 8.1 я не получаю правильное разрешение от ctypes или tk.
У других людей такая же проблема для ctypes: getsystemmetrics возвращает неправильный размер экрана
Чтобы получить правильное полное разрешение монитора с высоким DPI на Windows 8.1, необходимо вызвать SetProcessDPIAware и использовать следующий код:
import ctypes
user32 = ctypes.windll.user32
user32.SetProcessDPIAware()
[w, h] = [user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)]
Полная информация ниже:
Я обнаружил, что это потому, что Windows сообщает масштабированное разрешение. Похоже, что Python по умолчанию является приложением, поддерживающим систему dpi. Типы приложений с поддержкой DPI перечислены здесь:
http://msdn.microsoft.com/en-us/library/windows/desktop/dn469266%28v=vs.85%29.aspx#dpi_and_the_desktop_scaling_factor
По сути, вместо отображения контента в полном разрешении монитора, что может привести к уменьшению шрифтов, контент масштабируется до тех пор, пока шрифты не станут достаточно большими.
На моем мониторе я получаю:
Физическое разрешение: 2560 x 1440 (220 DPI)
Заявленное разрешение python: 1555 x 875 (158 DPI)
За этот сайт windows: http://msdn.microsoft.com/en-us/library/aa770067%28v=vs.85%29.aspx
Формула для сообщаемого эффективного разрешения системы:
(сообщил_px * current_dpi) / (96 т / д) = физический_px
Я могу получить правильное разрешение экрана и текущий DPI с приведенным ниже кодом.
Обратите внимание, что я вызываю SetProcessDPIAware (), чтобы программа могла видеть реальное разрешение.
import tkinter as tk
root = tk.Tk()
width_px = root.winfo_screenwidth()
height_px = root.winfo_screenheight()
width_mm = root.winfo_screenmmwidth()
height_mm = root.winfo_screenmmheight()
# 2.54 cm = in
width_in = width_mm / 25.4
height_in = height_mm / 25.4
width_dpi = width_px/width_in
height_dpi = height_px/height_in
print('Width: %i px, Height: %i px' % (width_px, height_px))
print('Width: %i mm, Height: %i mm' % (width_mm, height_mm))
print('Width: %f in, Height: %f in' % (width_in, height_in))
print('Width: %f dpi, Height: %f dpi' % (width_dpi, height_dpi))
import ctypes
user32 = ctypes.windll.user32
user32.SetProcessDPIAware()
[w, h] = [user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)]
print('Size is %f %f' % (w, h))
curr_dpi = w*96/width_px
print('Current DPI is %f' % (curr_dpi))
Который вернул:
Width: 1555 px, Height: 875 px
Width: 411 mm, Height: 232 mm
Width: 16.181102 in, Height: 9.133858 in
Width: 96.099757 dpi, Height: 95.797414 dpi
Size is 2560.000000 1440.000000
Current DPI is 158.045016
Я использую Windows 8.1 с монитором с разрешением 220 точек на дюйм.
Моё масштабирование экрана устанавливает мой текущий DPI на 158.
Я буду использовать 158, чтобы убедиться, что мои графики matplotlib имеют правильный размер с:
из pylab import rcParams
rcParams ['figure.dpi'] = curr_dpi