傀儡師の館.Python

傀儡師の館.Python

PR

Calendar

Keyword Search

▼キーワード検索

Archives

2024.11
2024.10
2024.09
2024.08
2024.07
2024.06
2024.05
2024.04
2024.03
2024.02

Profile

kugutsushi

kugutsushi

Free Space

設定されていません。
2015.08.21
XML
カテゴリ: Python
私が比較的よく訪れるサイトの一つに the mouse vs. the pythonpython programming from the frontlin がある。Pythonプログラミングのヒントがいろいろ掲載されるので好きなサイト。

今日は、 Getting Your Screen Resolution with Python というのが載っていたのでやってみた。

  • Using the Linux Command Line
  • Using PyGTK
  • Using wxPython
  • Using Tkinter
  • Using PySide / PyQt

それぞれの記述がある。いずれにせよ、下回りは、Windowsなら PyWin32 の win32api か ctypes 、Mac なら AppKit とか、プラットフォームに依存しているわけだが、上記のようなクロスプラットフォームな GUI のフレームを使うことによって吸収されるので、意識する必要はない。

ちなみに、最初の Linux の例では、X Window 環境なら xrandr | grep '*' でコマンドの出力から '*' のある行を取り出して、最初の部分に解像度があるので、テキスト処理をしているというもの。コマンド出力をちょっと処理してというのを subprocess.Popen でパイプ処理してという類の参考になる。つまり、こんな感じ、あとでパイプ処理を他の用途に流用できるようにしてみた(1つコマンドを実行して、その結果を2つ目のコマンドで処理してのパターン)。


import subprocess

def 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 GetSystemMetrics

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

か、もっと最低限の読み込みだと、

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

How do I get monitor resolution in Python? を見ると、もうちょっと、正確にやるにはどうしたらよいかというのも色々議論がある。例えば、Windows 上で DPI やデスクトップスケーリングを考慮した場合にはどうなるとか。( dpi_and_the_desktop_scaling_factor

ところで複数のモニターとか接続してたらどうなるのか。あれこれ考慮し始めると面倒なことになる。なので、先人の成果をいただいて、

pip install screeninfo


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

でよいかと。すばらしい。





お気に入りの記事を「いいね!」で応援しよう

Last updated  2015.08.21 05:22:11
コメント(0) | コメントを書く


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x

© Rakuten Group, Inc.
X
Design a Mobile Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: