質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2536閲覧

Pythonについて初歩的な質問をさせてください。

YagiYukio

総合スコア15

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/08/16 08:16

前提・実現したいこと

メモ帳を開いて右上の×マークを画像認識して閉じたい。
1)メモ帳を開く。
2)メモ帳を閉じる。

1と2を別々に書いて、1を実行してから2を実行するとうまくいきます。

しかし、1と2をつなげて書いて一度に実行するとエラーになります。

そもそもお作法違反なのか、XYの型設定がいるのかなど、基本的なことが分からないので、
お手数ですが、ご指導いただきたいです。
よろしくお願いいたします。

発生している問題・エラーメッセージ

TypeError Traceback (most recent call last) <ipython-input-85-902036f72171> in <module> 2 import pyautogui 3 subprocess.Popen(r'C:\Windows\System32\notepad.exe') ----> 4 x,y = pyautogui.locateCenterOnScreen(r'C:\MEMOPAD.PNG') 5 pyautogui.moveTo(x,y) 6 pyautogui.click() TypeError: cannot unpack non-iterable NoneType object

該当のソースコード

1)これは単独では実行できます。 import subprocess subprocess.Popen(r'C:\Windows\System32\notepad.exe') 2)メモ帳が開いていればこれも単独では実行できます。 import pyautogui x,y = pyautogui.locateCenterOnScreen(r'C:\MEMOPAD.PNG') pyautogui.moveTo(x,y) pyautogui.click() 3)合体(これがエラーになる理由が分からない) import subprocess subprocess.Popen(r'C:\Windows\System32\notepad.exe') import pyautogui x,y = pyautogui.locateCenterOnScreen(r'C:\MEMOPAD.PNG') pyautogui.moveTo(x,y) pyautogui.click()

試したこと

開いてすぐ閉じるのが時間的に間に合っていないのかと思って、SLEEP3秒とか入れてみましたけど、改善しませんでした。

補足情報(FW/ツールのバージョンなど)

pyautoguiは0.9.53
ただ上記の実行にはあまり関係がないかもしれないです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

python

1x,y = pyautogui.locateCenterOnScreen(r'C:\MEMOPAD.PNG')

既にメモ帳を開いている状態で閉じる動作のみをさせる場合はプログラムを実行するためコマンドプロンプト等がアクティブとなりメモ帳のウィンドウがアクティブではなくなります。
しかし、subprocessを用いてメモ帳を起動するとメモ帳のウィンドウが最前面でアクティブとなるため、ボタンの見た目が変わってしまいます。
その場合に、アクティブではない閉じるボタンの画像(現在質問者さんが使用していると思われる画像)ではアクティブなメモ帳のボタンを発見することができません。
その結果locateCenterOnScreenの戻り値がNoneとなりエラーが発生しているのではないかと思います。

ですので、一度メモ帳がアクティブな状態であるときの閉じるボタンの画像を使用して一連のコマンドを実行してみてください。

参考: Windows10でのメモ帳の画像
(上: アクティブな状態, 下: アクティブでない状態)
アクティブ
インアクティブ

投稿2021/08/16 14:33

Alma-field

総合スコア108

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YagiYukio

2021/08/17 01:05

まさにこれが正しくて、アクティブかどうかでの色の濃淡で挙動が分かれていました!! こんなのに気づかれるなんて、回答者様天才でしょうか!? 実際にはSLEEP1秒も必要で以下で意図通りに挙動いたしました。 画像はかなり厳密に拾ってることが分かりました。 import subprocess import time subprocess.Popen(r'C:\Windows\System32\notepad.exe') time.sleep(1) import pyautogui x,y = pyautogui.locateCenterOnScreen(r'C:\MEMOPAD2.PNG') pyautogui.moveTo(x,y) pyautogui.click()
YagiYukio

2021/08/17 01:06

このMEMOPAD2についてはアクティブ状態での×を利用しています。
YagiYukio

2021/08/17 01:29

結局、こうなりました。ありがとうございます!! import subprocess import time import pyautogui subprocess.Popen(r'C:\Windows\System32\notepad.exe') time.sleep(1) locate = pyautogui.locateCenterOnScreen(r'C:\MEMOPAD.PNG') if locate == None: x,y = pyautogui.locateCenterOnScreen(r'C:\MEMOPAD2.PNG') else: x,y = pyautogui.locateCenterOnScreen(r'C:\MEMOPAD.PNG') pyautogui.moveTo(x,y) pyautogui.click()
guest

0

もし、起動するとちゃんとメモ帳が起動するのであれば、popenはプロセスを起動するとすぐに返りますので、pyautogui.locateCenterOnScreen() の呼び出しが早すぎるのかもしれません。

間にsleepを入れてみてはいかがでしょうか。

投稿2021/08/16 10:47

TakaiY

総合スコア12747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YagiYukio

2021/08/16 12:27

それが、「試したこと」にも記載したようにスリープはいれてみたんですよね。 3秒とか5秒とかでもダメだったので、困ってしまったのです。
shinami

2021/08/16 12:50

python使ったことないですが、スリープじゃなくてタイマーは無いのでしょうか? スリープはプログラムを止めるので何秒にしようと意味ないとか? あと、x,y = pyautogui.locateCenterOnScreen(r'C:\MEMOPAD.PNG')の後とかにも入れてみるとか。 スリープもタイマーも 違ってたらスルーしてください。
TakaiY

2021/08/16 13:29 編集

sleepは入れてみたのですね。 読んでなくてすみません。 そのSleepの間にメモ帳は立ち上がるのでしょうか? また、立ち上ったメモ帳は最全面に出ているでしょうか? print文などを入れて、それぞれのコマンドの実行されるタイミングとメモ帳が表示されるタイミングを調べてみてはどうでしょう。 それぞれで単独で動くのであれば、GUIの操作なので、タイミングの問題なのではないかと思っています。 ちなみに、これ、初歩的な質問ではありませんよ。
YagiYukio

2021/08/17 01:06

実際の挙動にはSLEEPも必要でした! あありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問