ฉันจะรับความละเอียดของจอภาพใน Python ได้อย่างไร


126

วิธีที่ง่ายที่สุดในการรับความละเอียดของจอภาพคืออะไร (ควรเป็นทูเพิล)


คุณใช้ชุดเครื่องมือ UI เฉพาะหรือไม่? (. เช่น GTK, wxPython, Tkinter ฯลฯ )
detly

11
ด้วยTkinterโมดูลคุณสามารถทำได้ด้วยวิธีนี้ เป็นส่วนหนึ่งของไลบรารี Python มาตรฐานและใช้ได้กับแพลตฟอร์ม Unix และ Windows ส่วนใหญ่
martineau

1
ภาพรวมที่ดีเกี่ยวกับเทคนิคต่างๆสำหรับ UI ทั่วไปมีให้ที่ลิงค์นี้
ImportanceOfBeingErnest

คำตอบ:


75

บน Windows:

from win32api import GetSystemMetrics

print("Width =", GetSystemMetrics(0))
print("Height =", GetSystemMetrics(1))

หากคุณกำลังทำงานกับหน้าจอความละเอียดสูงตรวจสอบให้แน่ใจว่าล่ามหลามของคุณเป็น HIGHDPIAWARE

บนพื้นฐานนี้โพสต์


9
สำหรับโซลูชันที่สมบูรณ์แบบหลายแพลตฟอร์มโปรดดูคำตอบ
Dhruv Reshamwala

1
เมื่อใช้จอภาพหลายจอสิ่งนี้จะส่งคืนเฉพาะขนาดของจอแสดงผลหลัก
Stevoisiak

1
คุณตั้งค่าล่าม python ให้เป็นhighdpiawareอย่างไร? สิ่งนี้จะเป็นประโยชน์เมื่อรวมไว้ในคำตอบ
eric

121

ใน Windows คุณสามารถใช้ ctypes กับGetSystemMetrics():

import ctypes
user32 = ctypes.windll.user32
screensize = user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)

เพื่อที่คุณไม่จำเป็นต้องติดตั้งแพ็คเกจ pywin32 ไม่ต้องการอะไรที่ไม่มีมาพร้อมกับ Python เอง

สำหรับการตั้งค่าหลายจอภาพคุณสามารถดึงความกว้างและความสูงรวมของจอภาพเสมือนได้:

import ctypes
user32 = ctypes.windll.user32
screensize = user32.GetSystemMetrics(78), user32.GetSystemMetrics(79)

11
หมายเหตุสำคัญ: ค่าที่ส่งคืนอาจไม่ถูกต้องหากใช้การปรับขนาด DPI (เช่นมักเป็นกรณีบนจอแสดงผล 4k) คุณต้องเรียกใช้ SetProcessDPIAware ก่อนที่จะเริ่มต้นส่วนประกอบ GUI (ไม่ใช่ก่อนที่จะเรียกฟังก์ชัน GetSystemMetrics) นี่เป็นความจริงสำหรับคำตอบส่วนใหญ่ที่นี่ (GTK ฯลฯ ) บนแพลตฟอร์ม win32
totaam

1
สำหรับจอภาพหลายจอคุณสามารถใช้ GetSystemMetrics (78) และ GetSystemMetrics (79)
Derek

@Derek อะไรGetSystemMetrics(78)และGetSystemMetrics(79)ผลตอบแทน?
Stevoisiak

@StevenVascellaro ความกว้าง / ความสูงของหน้าจอเสมือนเป็นพิกเซล msdn.microsoft.com/en-us/library/windows/desktop/…
Derek

94

ฉันสร้างโมดูล PyPIด้วยเหตุผลนี้:

pip install screeninfo

รหัส:

from screeninfo import get_monitors
for m in get_monitors():
    print(str(m))

ผลลัพธ์:

monitor(1920x1080+1920+0)
monitor(1920x1080+0+0)

มันสนับสนุนสภาพแวดล้อมหลายจอ เป้าหมายคือการข้ามแพลตฟอร์ม ตอนนี้รองรับ Cygwin และ X11 แต่ยินดีต้อนรับคำขอดึงโดยสิ้นเชิง


2
ใช้งานได้ดีบน Windows แต่ Mac ฉันได้รับข้อผิดพลาดต่อไปนี้: ImportError: ไม่สามารถโหลด X11 ได้
Chris Lucian

5
ใช้งานได้ดีบน Ubuntu ทดสอบบน Ubuntu 16.04
Dhruv Reshamwala

3
FYI, Windows DPI scaling ยังคงใช้อยู่ บรรทัดนี้จะบอก Windows ว่าคุณต้องการความละเอียดแบบดิบที่ไม่ได้ปรับขนาด: "import ctypes; user32 = ctypes.windll.user32; user32.SetProcessDPIAware ()" 1) คำตอบของคุณควรอยู่ในอันดับต้น ๆ ทำได้ดีมาก 2) ความคิดเห็นของฉันเป็นเฉพาะ Windows ไม่ใช่เฉพาะไลบรารี (เช่น screeninfo) 3) โค้ดที่ฉีกและทดสอบจากความคิดเห็นของ KobeJohn ที่นี่: stackoverflow.com/a/32541666/2616321
Jason2616321

6
โมดูลที่มีประโยชน์ (+1) ฉันต้องติดตั้งข้อกำหนดสองสามข้อ (เช่นpip install cython pyobjus) ก่อนจึงจะสามารถใช้งานบน OSX ได้
George Profenza

45

หากคุณใช้ wxWindows คุณสามารถทำได้ง่ายๆดังนี้

import wx

app = wx.App(False) # the wx.App object must be created first.    
print(wx.GetDisplaySize())  # returns a tuple

นี่คือสิ่งที่ดีที่สุด ... ใครไม่มี wx? :) บวกสองสามบรรทัดแทนรหัสพวงในดวงตาของคุณ นี่เป็นวิธีเริ่มต้นของฉันแล้วขอบคุณ
m3nda

1
นี้ควรจะเป็นapp = wx.App(False)มิฉะนั้นคุณจะได้รับ "วัตถุ wx.App ต้องได้รับการสร้างขึ้นครั้งแรก." ความผิดพลาด 26 โหวตแล้วไม่มีใครตรวจสอบ? ทำงานใน Windows โดยไม่ต้องเชื่อมโยงอินสแตนซ์ wx กับตัวแปรหรือไม่
m3nda

2
ใครไม่มี wx หลายคน?
มาร์ช

44

นำมาจากคำตอบของโพสต์นี้โดยตรง: จะรับขนาดหน้าจอใน Tkinter ได้อย่างไร?

import tkinter as tk

root = tk.Tk()

screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()

8
หากคุณมีจอแสดงผลภายนอกขยายออกไปข้างจอแสดงผลหลักวิธีนี้จะให้ผลรวมของความละเอียดของการแสดงผลทั้งหมดไม่ใช่ความละเอียดของการแสดงผลปัจจุบัน
jadelord

สำหรับขั้นตอนที่หน้าจอหลายเห็นคำตอบของฉัน
norok2

30

ใน 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 จะเป็นแอปพลิเคชัน 'system dpi awareness' โดยค่าเริ่มต้น ประเภทของแอปพลิเคชันที่ทราบ 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 สูตรสำหรับความละเอียดที่มีประสิทธิภาพของระบบที่รายงานคือ: (Report_px * current_dpi) / (96 dpi ) = physical_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 การปรับขนาดการแสดงผลของฉันตั้งค่า DPI ปัจจุบันของฉันเป็น 158

ฉันจะใช้ 158 เพื่อให้แน่ใจว่าพล็อต matplotlib ของฉันมีขนาดที่เหมาะสมโดย: from pylab import rcParams rcParams ['figure.dpi'] = curr_dpi


คุณมีข้อมูลดีๆมากมายที่นี่ แต่คำตอบนั้นฝังอยู่ตรงกลาง เพื่อให้ง่ายต่อการอ่านคุณช่วยชี้แจงได้ไหมว่าคำตอบคืออะไรจากนั้นให้ข้อมูลพื้นฐาน
skrrgwasme

ฉันแก้ไขโพสต์ของฉันเพื่อแสดงคำตอบในตอนต้นจากนั้นเข้าสู่รายละเอียด ขอบคุณสำหรับความคิดเห็น.
เว้นวรรค

1
ดูเหมือนว่ามีข้อบกพร่องในการคำนวณที่นี่ซึ่งง่ายต่อการสังเกตว่าคุณคำนวณขนาดเส้นทแยงมุมจากความกว้างและความสูงที่รายงาน (นิ้ว) หน้าจอของฉันที่มีเส้นทแยงมุม 13.3 นิ้วถูกรายงานว่าเป็น 15 นิ้ว ดูเหมือนว่าTkinterกำลังใช้พิกเซลที่ถูกต้อง แต่ไม่ทราบถึงการปรับขนาด dpi จึงรายงานขนาดมม. ที่ไม่ถูกต้อง
Primer

สิ่งนี้ใช้ไม่ได้กับ Windows 10 ที่นั่นดูเหมือนว่า SetSystemDPIAware () จะไม่สร้างความแตกต่าง อย่างไรก็ตามการเรียก ctypes.windll.shcore.SetProcessDpiAwareness (2) แทนดูเหมือนจะทำเคล็ดลับ
Klamer Schutte

: @KlamerSchutte ข้อผิดพลาดผลตอบแทนctypes.windll.shcore.SetProcessDpiAwareness(2) OSError: [WinError 126] The specified module could not be found
Adrian Keister

21

และเพื่อความสมบูรณ์ Mac OS X

import AppKit
[(screen.frame().size.width, screen.frame().size.height)
    for screen in AppKit.NSScreen.screens()]

จะให้รายการ tuples ที่มีขนาดหน้าจอทั้งหมด (หากมีหลายจอ)


15

หากคุณใช้Qtชุดเครื่องมือโดยเฉพาะPySideคุณสามารถดำเนินการดังต่อไปนี้:

from PySide import QtGui
import sys

app = QtGui.QApplication(sys.argv)
screen_rect = app.desktop().screenGeometry()
width, height = screen_rect.width(), screen_rect.height()

13

การใช้ Linux วิธีที่ง่ายที่สุดคือรันคำสั่ง bash

xrandr | grep '*'

และแยกวิเคราะห์ผลลัพธ์โดยใช้ regexp

นอกจากนี้คุณสามารถทำได้ผ่าน PyGame: http://www.daniweb.com/forums/thread54881.html


คุณใช้ pygame เพื่อรับความละเอียดหน้าจอได้อย่างไร?
Jamie Twells

11

นี่คือโปรแกรม Python สั้น ๆ ที่จะแสดงข้อมูลเกี่ยวกับการตั้งค่าหลายจอภาพของคุณ:

import gtk

window = gtk.Window()

# the screen contains all monitors
screen = window.get_screen()
print "screen size: %d x %d" % (gtk.gdk.screen_width(),gtk.gdk.screen_height())

# collect data about each monitor
monitors = []
nmons = screen.get_n_monitors()
print "there are %d monitors" % nmons
for m in range(nmons):
  mg = screen.get_monitor_geometry(m)
  print "monitor %d: %d x %d" % (m,mg.width,mg.height)
  monitors.append(mg)

# current monitor
curmon = screen.get_monitor_at_window(screen.get_active_window())
x, y, width, height = monitors[curmon]
print "monitor %d: %d x %d (current)" % (curmon,width,height)  

นี่คือตัวอย่างของผลลัพธ์:

screen size: 5120 x 1200
there are 3 monitors
monitor 0: 1600 x 1200
monitor 1: 1920 x 1200
monitor 2: 1600 x 1200
monitor 1: 1920 x 1200 (current)

ไม่gtk.Window()ได้รับgdk_default_root_window? คุณแน่ใจได้อย่างไรว่า.get_screenมีจอภาพทั้งหมดหรือไม่?
yatg

ฉันถามเพราะในรหัสของฉันฉันพยายามทำซ้ำรหัสของคุณฉันกำลังทำใน jsctypes และมันก็บอกฉัน 0 จอภาพ: gist.github.com/yajd/55441c9c3d0711ee4a38#file-gistfile1-txt-L3
yatg

2
เป็นเวลานานแล้วที่ฉันเขียนโค้ดนั้น แต่ถ้าฉันจำได้ถูกต้องสิ่งที่gtk.Window()จะสร้างหน้าต่างใหม่ (ดูที่นี่ ) หน้าต่างเป็นเพียงวิธีget_screenการรับข้อมูลจอภาพ มันส่งกลับหน้าจอที่หน้าต่างเปิดอยู่ (หรือจะเป็นถ้าเคยแสดง) ฉันเดาว่ามันขึ้นอยู่กับการกำหนดค่า X ว่า "หน้าจอ" นั้นมี "จอภาพ" ทั้งหมดหรือไม่ มันทำงานบนระบบของฉันด้วย Twinview
starfry

ขอบคุณ @starfry! ฉันต้องการหาวิธีแก้ปัญหาแบบไขว้ซึ่งทำให้จอภาพและขนาดของจอภาพทั้งหมดไม่คำนึงถึงหน้าจอ คุณเคยมีทักษะในการพัฒนาอะไรแบบนั้นบ้างไหม? :)
yatg

ทางเลือกสำหรับชุดเครื่องมือรุ่นที่ใหม่กว่า: `` python
satyagraha

9

ฉันใช้เมธอด get_screen_resolution ในหนึ่งในโปรเจ็กต์ของฉันเช่นเดียวกับโปรเจ็กต์ด้านล่างซึ่งโดยพื้นฐานแล้วเป็นเชนการนำเข้า คุณสามารถปรับเปลี่ยนสิ่งนี้ได้ตามความต้องการของคุณโดยถอดชิ้นส่วนที่ไม่จำเป็นออกและย้ายพอร์ตที่เป็นไปได้มากขึ้นในห่วงโซ่

PYTHON_V3 = sys.version_info >= (3,0,0) and sys.version_info < (4,0,0):
#[...]
    def get_screen_resolution(self, measurement="px"):
        """
        Tries to detect the screen resolution from the system.
        @param measurement: The measurement to describe the screen resolution in. Can be either 'px', 'inch' or 'mm'. 
        @return: (screen_width,screen_height) where screen_width and screen_height are int types according to measurement.
        """
        mm_per_inch = 25.4
        px_per_inch =  72.0 #most common
        try: # Platforms supported by GTK3, Fx Linux/BSD
            from gi.repository import Gdk 
            screen = Gdk.Screen.get_default()
            if measurement=="px":
                width = screen.get_width()
                height = screen.get_height()
            elif measurement=="inch":
                width = screen.get_width_mm()/mm_per_inch
                height = screen.get_height_mm()/mm_per_inch
            elif measurement=="mm":
                width = screen.get_width_mm()
                height = screen.get_height_mm()
            else:
                raise NotImplementedError("Handling %s is not implemented." % measurement)
            return (width,height)
        except:
            try: #Probably the most OS independent way
                if PYTHON_V3: 
                    import tkinter 
                else:
                    import Tkinter as tkinter
                root = tkinter.Tk()
                if measurement=="px":
                    width = root.winfo_screenwidth()
                    height = root.winfo_screenheight()
                elif measurement=="inch":
                    width = root.winfo_screenmmwidth()/mm_per_inch
                    height = root.winfo_screenmmheight()/mm_per_inch
                elif measurement=="mm":
                    width = root.winfo_screenmmwidth()
                    height = root.winfo_screenmmheight()
                else:
                    raise NotImplementedError("Handling %s is not implemented." % measurement)
                return (width,height)
            except:
                try: #Windows only
                    from win32api import GetSystemMetrics 
                    width_px = GetSystemMetrics (0)
                    height_px = GetSystemMetrics (1)
                    if measurement=="px":
                        return (width_px,height_px)
                    elif measurement=="inch":
                        return (width_px/px_per_inch,height_px/px_per_inch)
                    elif measurement=="mm":
                        return (width_px/mm_per_inch,height_px/mm_per_inch)
                    else:
                        raise NotImplementedError("Handling %s is not implemented." % measurement)
                except:
                    try: # Windows only
                        import ctypes
                        user32 = ctypes.windll.user32
                        width_px = user32.GetSystemMetrics(0)
                        height_px = user32.GetSystemMetrics(1)
                        if measurement=="px":
                            return (width_px,height_px)
                        elif measurement=="inch":
                            return (width_px/px_per_inch,height_px/px_per_inch)
                        elif measurement=="mm":
                            return (width_px/mm_per_inch,height_px/mm_per_inch)
                        else:
                            raise NotImplementedError("Handling %s is not implemented." % measurement)
                    except:
                        try: # Mac OS X only
                            import AppKit 
                            for screen in AppKit.NSScreen.screens():
                                width_px = screen.frame().size.width
                                height_px = screen.frame().size.height
                                if measurement=="px":
                                    return (width_px,height_px)
                                elif measurement=="inch":
                                    return (width_px/px_per_inch,height_px/px_per_inch)
                                elif measurement=="mm":
                                    return (width_px/mm_per_inch,height_px/mm_per_inch)
                                else:
                                    raise NotImplementedError("Handling %s is not implemented." % measurement)
                        except: 
                            try: # Linux/Unix
                                import Xlib.display
                                resolution = Xlib.display.Display().screen().root.get_geometry()
                                width_px = resolution.width
                                height_px = resolution.height
                                if measurement=="px":
                                    return (width_px,height_px)
                                elif measurement=="inch":
                                    return (width_px/px_per_inch,height_px/px_per_inch)
                                elif measurement=="mm":
                                    return (width_px/mm_per_inch,height_px/mm_per_inch)
                                else:
                                    raise NotImplementedError("Handling %s is not implemented." % measurement)
                            except:
                                try: # Linux/Unix
                                    if not self.is_in_path("xrandr"):
                                        raise ImportError("Cannot read the output of xrandr, if any.")
                                    else:
                                        args = ["xrandr", "-q", "-d", ":0"]
                                        proc = subprocess.Popen(args,stdout=subprocess.PIPE)
                                        for line in iter(proc.stdout.readline,''):
                                            if isinstance(line, bytes):
                                                line = line.decode("utf-8")
                                            if "Screen" in line:
                                                width_px = int(line.split()[7])
                                                height_px = int(line.split()[9][:-1])
                                                if measurement=="px":
                                                    return (width_px,height_px)
                                                elif measurement=="inch":
                                                    return (width_px/px_per_inch,height_px/px_per_inch)
                                                elif measurement=="mm":
                                                    return (width_px/mm_per_inch,height_px/mm_per_inch)
                                                else:
                                                    raise NotImplementedError("Handling %s is not implemented." % measurement)
                                except:
                                    # Failover
                                    screensize = 1366, 768
                                    sys.stderr.write("WARNING: Failed to detect screen size. Falling back to %sx%s" % screensize)
                                    if measurement=="px":
                                        return screensize
                                    elif measurement=="inch":
                                        return (screensize[0]/px_per_inch,screensize[1]/px_per_inch)
                                    elif measurement=="mm":
                                        return (screensize[0]/mm_per_inch,screensize[1]/mm_per_inch)
                                    else:
                                        raise NotImplementedError("Handling %s is not implemented." % measurement)

1
ขอบคุณสำหรับการแบ่งปันสิ่งนี้ แต่อาจสั้นลงได้มากโดยใช้ฟังก์ชันเพื่อจัดการกรณี if-else
Udayraj Deshmukh

8

คำถามเก่า แต่หายไป ฉันเพิ่งเคยใช้ python ดังนั้นโปรดบอกฉันว่านี่เป็นวิธีแก้ปัญหาที่ "ไม่ดี" หรือไม่ โซลูชันนี้รองรับ Windows และ MacOS เท่านั้นและใช้ได้กับหน้าจอหลักเท่านั้น - แต่ระบบไม่ได้กล่าวถึงในคำถาม

วัดขนาดโดยการจับภาพหน้าจอ เนื่องจากขนาดหน้าจอไม่ควรเปลี่ยนจึงต้องทำเพียงครั้งเดียว มีโซลูชันที่หรูหรากว่านี้หากคุณติดตั้งชุดเครื่องมือ gui เช่น GTK, wx, ...

ดูหมอน

pip install Pillow

from PIL import ImageGrab

img = ImageGrab.grab()
print (img.size)

6

เวอร์ชัน XWindows:

#!/usr/bin/python

import Xlib
import Xlib.display

resolution = Xlib.display.Display().screen().root.get_geometry()
print str(resolution.width) + "x" + str(resolution.height)

6

ขยายคำตอบของ@ user2366975เพื่อรับขนาดหน้าจอปัจจุบันในการตั้งค่าหลายหน้าจอโดยใช้ Tkinter (รหัสใน Python 2/3):

try:
    # for Python 3
    import tkinter as tk
except ImportError:
    # for Python 2
    import Tkinter as tk


def get_curr_screen_geometry():
    """
    Workaround to get the size of the current screen in a multi-screen setup.

    Returns:
        geometry (str): The standard Tk geometry string.
            [width]x[height]+[left]+[top]
    """
    root = tk.Tk()
    root.update_idletasks()
    root.attributes('-fullscreen', True)
    root.state('iconic')
    geometry = root.winfo_geometry()
    root.destroy()
    return geometry

(ควรทำงานข้ามแพลตฟอร์มทดสอบบน Linux เท่านั้น)



5

ในกรณีที่คุณติดตั้ง PyQt4 ให้ลองใช้รหัสต่อไปนี้:

from PyQt4 import QtGui
import sys

MyApp = QtGui.QApplication(sys.argv)
V = MyApp.desktop().screenGeometry()
h = V.height()
w = V.width()
print("The screen resolution (width X height) is the following:")
print(str(w) + "X" + str(h))

สำหรับ PyQt5 สิ่งต่อไปนี้จะใช้งานได้:

from PyQt5 import QtWidgets
import sys

MyApp = QtWidgets.QApplication(sys.argv)
V = MyApp.desktop().screenGeometry()
h = V.height()
w = V.width()
print("The screen resolution (width X height) is the following:")
print(str(w) + "X" + str(h))

5

ข้ามแพลตฟอร์มและวิธีง่ายๆในการทำเช่นนี้คือใช้ TKinter ที่มาพร้อมกับ python เกือบทุกเวอร์ชันดังนั้นคุณไม่ต้องติดตั้งอะไรเลย:

import tkinter
root = tkinter.Tk()
root.withdraw()
WIDTH, HEIGHT = root.winfo_screenwidth(), root.winfo_screenheight()

3

การใช้ Linux แทน regexp ใช้บรรทัดแรกและนำค่าความละเอียดปัจจุบันออก

ความละเอียดปัจจุบันของการแสดงผล: 0

>>> screen = os.popen("xrandr -q -d :0").readlines()[0]
>>> print screen
Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 1920 x 1920
>>> width = screen.split()[7]
>>> print width
1920
>>> height = screen.split()[9][:-1]
>>> print height
1080
>>> print "Current resolution is %s x %s" % (width,height)
Current resolution is 1920 x 1080

สิ่งนี้ทำบน xrandr 1.3.5 ฉันไม่รู้ว่าเอาต์พุตแตกต่างจากเวอร์ชันอื่นหรือไม่ แต่ควรทำให้ง่ายต่อการเข้าใจ


น่าเศร้าที่ไม่ค่อยดีกับการตั้งค่ามัลติมอนิเตอร์ ไม่ใช่ความผิดของ python แต่การใช้สิ่งนี้อาจได้ผลลัพธ์ที่ไม่คาดคิด ...
black_puppydog

2

ในการรับบิตต่อพิกเซล:

import ctypes
user32 = ctypes.windll.user32
gdi32 = ctypes.windll.gdi32

screensize = (user32.GetSystemMetrics(0), user32.GetSystemMetrics(1))
print "screensize =%s"%(str(screensize))
dc = user32.GetDC(None);

screensize = (gdi32.GetDeviceCaps(dc,8), gdi32.GetDeviceCaps(dc,10), gdi32.GetDeviceCaps(dc,12))
print "screensize =%s"%(str(screensize))
screensize = (gdi32.GetDeviceCaps(dc,118), gdi32.GetDeviceCaps(dc,117), gdi32.GetDeviceCaps(dc,12))
print "screensize =%s"%(str(screensize))

พารามิเตอร์ใน gdi32:

#/// Vertical height of entire desktop in pixels
#DESKTOPVERTRES = 117,
#/// Horizontal width of entire desktop in pixels
#DESKTOPHORZRES = 118,
#/// Horizontal width in pixels
#HORZRES = 8,
#/// Vertical height in pixels
#VERTRES = 10,
#/// Number of bits per pixel
#BITSPIXEL = 12,

2

ลอง pyautogui:

import pyautogui
resolution = pyautogui.size()
print(resolution) 

คุณควรเพิ่มคำอธิบายว่าทำไมโค้ดนี้จึงควรใช้งานได้ - คุณยังสามารถเพิ่มความคิดเห็นในโค้ดได้ - ในรูปแบบปัจจุบันจะไม่มีคำอธิบายใด ๆ ที่สามารถช่วยให้ชุมชนที่เหลือเข้าใจสิ่งที่คุณทำเพื่อแก้ปัญหา /ตอบคำถาม. แต่นี่ก็เป็นคำถามที่เก่ามากเช่นกัน - พร้อมคำตอบที่ยอมรับ ...
ishmaelMakitla

2

เวอร์ชันอื่นที่ใช้xrandr:

import re
from subprocess import run, PIPE

output = run(['xrandr'], stdout=PIPE).stdout.decode()
result = re.search(r'current (\d+) x (\d+)', output)
width, height = map(int, result.groups()) if result else (800, 600)

2

ใช้pygame :

import pygame
pygame.init()
infos = pygame.display.Info()
screen_size = (infos.current_w, infos.current_h)

[1]

อย่างไรก็ตามหากคุณกำลังพยายามตั้งค่าหน้าต่างเป็นขนาดของหน้าจอคุณอาจต้องทำดังนี้

pygame.display.set_mode((0,0),pygame.FULLSCREEN)

เพื่อตั้งค่าการแสดงผลของคุณเป็นโหมดเต็มหน้าจอ [2]


ยืนยันว่าใช้งานได้บน Windows :) ช่างเป็นวิธีเฉพาะที่ดีสำหรับ Windows!
Lukasz Czerwinski

1

คุณสามารถใช้PyMouse ในการรับขนาดหน้าจอเพียงใช้screen_size()แอตทริบิวต์:

from pymouse import PyMouse
m = PyMouse()
a = m.screen_size()

aจะส่งคืนทูเพิลตำแหน่งแนวนอนอยู่(X, Y)ที่ไหนXและYเป็นตำแหน่งแนวตั้ง

ลิงก์ไปยังฟังก์ชันในเอกสารประกอบ


1

หากคุณกำลังทำงานบน Windows OS คุณสามารถใช้โมดูล OS เพื่อรับมัน:

import os
cmd = 'wmic desktopmonitor get screenheight, screenwidth'
size_tuple = tuple(map(int,os.popen(cmd).read().split()[-2::]))

มันจะส่งคืนทูเพิล(Y, X)โดยที่Yคือขนาดแนวตั้งและXคือขนาดแนวนอน รหัสนี้ใช้ได้กับ Python 2 และ Python 3


0

บน Linux เราสามารถใช้โมดูลกระบวนการย่อย

import subprocess
cmd = ['xrandr']
cmd2 = ['grep', '*']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
p2 = subprocess.Popen(cmd2, stdin=p.stdout, stdout=subprocess.PIPE)
p.stdout.close()

resolution_string, junk = p2.communicate()
resolution = resolution_string.split()[0]
resolution = resolution.decode("utf-8") 
width = int(resolution.split("x")[0].strip())
heigth = int(resolution.split("x")[1].strip())

0

มันเป็นปัญหาเล็กน้อยสำหรับหน้าจอเรตินาฉันใช้ tkinter เพื่อรับขนาดปลอมใช้พิลโลว์คว้าเพื่อให้ได้ขนาดจริง:

import tkinter
root = tkinter.Tk()
resolution_width = root.winfo_screenwidth()
resolution_height = root.winfo_screenheight()
image = ImageGrab.grab()
real_width, real_height = image.width, image.height
ratio_width = real_width / resolution_width
ratio_height = real_height/ resolution_height

0

สำหรับ PyGtk เวอร์ชันที่ใหม่กว่า:

import gi
gi.require_version("Gdk", "3.0")
from gi.repository import Gdk

display = Gdk.Display.get_default()
n_monitors = display.get_n_monitors()
print("there are %d monitors" % n_monitors)
for m in range(n_monitors):
  monitor = display.get_monitor(m)
  geometry = monitor.get_geometry()
  print("monitor %d: %d x %d" % (m, geometry.width, geometry.height))

0

สำหรับ Linux คุณสามารถใช้สิ่งนี้:

import gi
gi.require_version("Gdk", "3.0")
from gi.repository import Gdk

s = Gdk.Screen.get_default()
screen_width = s.get_width()
screen_height = s.get_height()
print(screen_width)
print(screen_height)

0

สคริปต์ยูทิลิตี้โดยใช้pynputไลบรารี โพสต์ที่นี่เพื่ออ้างอิง:

 
from pynput.mouse import Controller as MouseController

def get_screen_size():
    """Utility function to get screen resolution"""

    mouse = MouseController()

    width = height = 0

    def _reset_mouse_position():
        # Move the mouse to the top left of 
        # the screen
        mouse.position = (0, 0)

    # Reset mouse position
    _reset_mouse_position()

    count = 0
    while 1:
        count += 1
        mouse.move(count, 0)
        
        # Get the current position of the mouse
        left = mouse.position[0]

        # If the left doesn't change anymore, then
        # that's the screen resolution's width
        if width == left:
            # Add the last pixel
            width += 1

            # Reset count for use for height
            count = 0
            break

        # On each iteration, assign the left to 
        # the width
        width = left
    
    # Reset mouse position
    _reset_mouse_position()

    while 1:
        count += 1
        mouse.move(0, count)

        # Get the current position of the mouse
        right = mouse.position[1]

        # If the right doesn't change anymore, then
        # that's the screen resolution's height
        if height == right:
            # Add the last pixel
            height += 1
            break

        # On each iteration, assign the right to 
        # the height
        height = right

    return width, height

>>> get_screen_size()
(1920, 1080)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.