Python でディスプレイの解像度を取得するには
私が比較的よく訪れるサイトの一つにthe mouse vs. the pythonpython programming from the frontlinがある。Pythonプログラミングのヒントがいろいろ掲載されるので好きなサイト。今日は、Getting Your Screen Resolution with Pythonというのが載っていたのでやってみた。Using the Linux Command LineUsing PyGTKUsing wxPythonUsing TkinterUsing PySide / PyQtそれぞれの記述がある。いずれにせよ、下回りは、Windowsなら PyWin32 の win32api か ctypes 、Mac なら AppKit とか、プラットフォームに依存しているわけだが、上記のようなクロスプラットフォームな GUI のフレームを使うことによって吸収されるので、意識する必要はない。ちなみに、最初の Linux の例では、X Window 環境なら xrandr | grep '*' でコマンドの出力から '*' のある行を取り出して、最初の部分に解像度があるので、テキスト処理をしているというもの。コマンド出力をちょっと処理してというのを subprocess.Popen でパイプ処理してという類の参考になる。つまり、こんな感じ、あとでパイプ処理を他の用途に流用できるようにしてみた(1つコマンドを実行して、その結果を2つ目のコマンドで処理してのパターン)。import subprocessdef command2pipe(cmd1, cmd2): p = subprocess.Popen(cmd1, stdout=subprocess.PIPE) p2 = subprocess.Popen(cmd2, stdin=p.stdout, stdout=subprocess.PIPE) p.stdout.close() first_line, rest_lines = p2.communicate() return(first_line, rest_lines)if __name__ == '__main__': cmd1 = ['xrandr'] cmd2 = ['grep', '*'] resolution_string, junk = command2pipe(cmd1, cmd2) resolution = resolution_string.split()[0] width, height = resolution.split('x') mesg = "Resolution: %sx%s" % (width, height) print(mesg)というのはさておき、それぞれの例をやってみたが、Linux 上では問題なく動いた。 Windows 10 上でも Linux のは別として、すべて問題なく動いた。クロスプラットフォームではなく Windows 上だけで動くことを前提であれば、Win32api や ctypes で呼び出した方が、読み込み時間が少ないので速い。from win32api import GetSystemMetricsprint "Width =", GetSystemMetrics(0)print "Height =", GetSystemMetrics(1)か、もっと最低限の読み込みだと、import ctypesuser32 = ctypes.windll.user32screensize = user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)How do I get monitor resolution in Python? を見ると、もうちょっと、正確にやるにはどうしたらよいかというのも色々議論がある。例えば、Windows 上で DPI やデスクトップスケーリングを考慮した場合にはどうなるとか。(dpi_and_the_desktop_scaling_factor)。ところで複数のモニターとか接続してたらどうなるのか。あれこれ考慮し始めると面倒なことになる。なので、先人の成果をいただいて、pip install screeninfofrom screeninfo import get_monitorsfor m in get_monitors(): print(str(m))でよいかと。すばらしい。