windowをPythonプログラムからコントロールしたいことがあると思います。
意外と面倒です。WindowsとLinux OSについてウィンドウを閉じる方法をサンプルコードでご紹介します。
ブラウザの場合、Seleniumを利用する方法があります。
Sleeniumを使いたくない場合、ブラウザ以外が対象の場合、どちらにも対応可能です。
それでは見ていきましょう!
ショートカットキーを使う
非常に万能なのがショートカットキーです。
「ctrl」+「w」でウィンドウを閉じることができます。
pyautoguiモジュールをインストールしておけば簡単に実装できます。
pyautoguiモジュールは、画面上でのマウスやキーボードの操作をシミュレートするためのツールです。
ウィンドウの移動・クリック、キーボードの入力などをプログラム内から自動化できます。
GUIテスト、自動化スクリプト、デモの作成などに利用されます。
座標指定や画像認識に基づく操作も可能で、クロスプラットフォームで動作します。
インストールは簡単です。
pip installするだけです。
pip install pyautogui
サンプルコードは次です。
import pyautogui
pyautogui.hotkey('ctrl', 'w')
前提として、ウィンドウをアクティベートしておく必要があります。
また、対象ウィンドウが無くても閉じようとするため、誤作動がある可能性があります。
その代わり、非常に簡単です。
pygetwindowを使う(Windows・Mac)
別の方法として、pygetwindowを使ってウィンドウを制御したいと思います。
pygetwindowは、Pythonプログラム内でウィンドウの検出や制御を行うためのモジュールです。
主にWindowsとmacOSを対象としており、
特定のウィンドウを取得・制御したり、ウィンドウの情報を取得したりできます。
ウィンドウのリストを取得し、タイトルや位置、サイズなどの属性にアクセス可能です。
さらに、ウィンドウのアクティブ化や最小化、閉じる操作も行えます。
ただし、Linuxプラットフォームでは動作が保証されていない場合があります。
ウィンドウ名を確認できるため、ショートカットよりも誤作動しにくくすることができます。
pipでインストールできます。
pip install pygetwindow
下記はメモ帳を閉じるサンプルです。
window_titleを変えて対象ウィンドウを変更できます。
import pygetwindow
window_title = "メモ帳"
window = pygetwindow.getWindowsWithTitle(window_title)
if window:
window[0].close()
xdotoolを使う(Linux)
pygetwindowはLinuxで動作しないことがあるため、別の方法をやってみたいと思います。
xdotoolを使います。
xdotoolはLinux上でX Window Systemの操作を自動化するためのコマンドラインツールです。
マウスカーソルの移動、クリック、キーボード入力などをシミュレートし、
ウィンドウの操作やアプリケーションの自動化に使用されます。
ターミナルやスクリプト内でコマンドを実行し、X Window Systemの各種操作を行います。
GUIテストやタスクの自動化、UIスクリプトの作成に活用されます。
インストールには次を実行します。
sudo apt-get update
sudo apt-get install xdotool
下記はchromiumブラウザを閉じるサンプルです。
ウィンドウ名を変えると対象を変えられます。
import subprocess
window_title = "chromium"
try:
window_id = subprocess.check_output(['xdotool', 'search', '--name', window_title]).decode().strip()
subprocess.call(['xdotool', 'windowkill', window_id])
except subprocess.CalledProcessError:
window_id = None
ウィンドウが見つからない場合にエラーになってしまうため、try-except構文にしてあります。
この辺の回避方法は色々ありそうですね。
サンプルコード
別記事でOS種類を判別する方法をご紹介していました。
掛け合わせて、OSごとに処理を変えるサンプルコードにしてみたいと思います。
import platform
system = platform.system()
window_title = "メモ帳"
if system == "Windows" or system == "Darwin":
import pygetwindow
window = pygetwindow.getWindowsWithTitle(window_title)
if window:
window[0].close()
elif system == "Linux":
import subprocess
try:
window_id = subprocess.check_output(['xdotool', 'search', '--name', window_title]).decode().strip()
subprocess.call(['xdotool', 'windowkill', window_id])
except subprocess.CalledProcessError:
window_id = None
else:
raise NotImplementedError("未知のオペレーティングシステムです。")
プラスアルファで関数化までしてしまえば、ウィンドウを閉じるサブモジュールとして使えそうですね。
今回は以上となります。
この記事が少しでもお役に立てれば幸いです。
それでは、読んで頂きありがとうございました!