2559357 ランダム
 ホーム | 日記 | プロフィール 【フォローする】 【ログイン】

傀儡師の館.Python

PR

日記/記事の投稿

カレンダー

キーワードサーチ

▼キーワード検索

カテゴリ

バックナンバー

2020年04月
2020年03月
2020年02月
2020年01月
2019年12月
2019年11月
2019年10月
2019年09月
2019年08月
2019年07月

フリーページ

プロフィール


kugutsushi

サイド自由欄

設定されていません。
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))

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






最終更新日  2015年08月21日 05時22分11秒
コメント(0) | コメントを書く
[Python] カテゴリの最新記事



Copyright (c) 1997-2020 Rakuten, Inc. All Rights Reserved.