4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

pythonでマウスの現在座標を表示する

Posted at

#はじめに
初投稿です。至らない部分が多々あると思いますがよろしくお願いします。pythonのkihonnのkもわからないので説明不足の点も多々あります。単語の使い方も怪しいです。初心者向けです。

#開発環境
visual studio 2019のpython3.7です。

#動機
pythonでマクロを作ろうと思い、そのテストのために作ってみようかなと思って作りました。

#使用するパッケージとその導入
Tkinterとpyautoguiを使いました。

mouseCapture.py
import tkinter as tk
import pyautogui as pgui

asでパッケージ名を省略できるみたいです。(tkinterとpyautoguiってパッケージでいいんですよね?パッケージとかモジュールとかの区別もついてないです)

#現在座標の表示
現在座標の表示をするための関数とそれをまとめたクラスを書きます。クラスはFrame,関数はコンストラクタと座標を更新するupdate_capture()の2つです。
コードは上で書いたものの続きです。

mouseCapture.py
class Frame(tk.Frame):
    def __init__(self,master=None):
        tk.Frame.__init__(self,master)
        self.position=tk.Label(self,text="")
        self.position.pack()
        self.update_capture()

    def update_capture(self):
        currentPosition=pgui.position()
        self.position.configure(text=currentPosition)
        self.after(20,self.update_capture)

解説できるところは解説していこうと思います。

Frameクラスはtkinterに備え付けのクラスで、widgetをまとめてくれるそうです。widgetは部品という意味です。(この記事を書きながら調べました:smiley:)ここでいう部品というのはLabelのことですね。ほかにもボタンなどが部品に該当します。

Label()のtextに表示したい文字列を代入して表示したい文字列を決め、pack()でそれを表示します。

下の関数のcurrentPositoinという変数はいらない気がしてきました、今更ですが。

configure()でtextの中身を変えます。ほかにも文字列の色とか変えられると思います。

after(n,f)でnミリ秒後にfを呼び出します。ここでは20ミリ秒後にupdate_capture()を再帰的に呼び出しています。これでプログラムが停止するまでupdate_capture()を呼び出し続けます。

#メイン部分
Frameクラスのインスタンスを生成し、それをpack()して、mainloop()をくっつければ完成です。

mouseCapture.py
if __name__ == "__main__":
    f = Frame()
    f.pack()
    f.mainloop()

mainloop()はtkinterに入っている関数です。その名の通りfを無限ループにします。(?)

この見出しをつけるのに悩みました。

main.py
if __name__ == "__main__":

このフレーズはお決まりだと思うんですけどなんという名前がついているのでしょうか。筆者、気になります。

#コード全体
プログラム全体のコードは以下のようになります。

mouseCapture.py
import tkinter as tk
import pyautogui as pgui

class Frame(tk.Frame):
    def __init__(self,master=None):
        tk.Frame.__init__(self,master)
        self.position=tk.Label(self,text="")
        self.position.pack()

        self.update_capture()

    def update_capture(self):
        currentPosition=pgui.position()
        self.position.configure(text=currentPosition)
        self.after(20,self.update_capture)

if __name__ == "__main__":
    f = Frame()
    f.pack()
    f.mainloop()

とりあえずこれをコピペすれば動きます。

#参考にしたサイト
pythonに初めて触れたと言っても過言ではないのでかなり多くのサイトを見ました。その中でも特に参考になったものを載せておきます。

https://qiita.com/SquidSky/items/90eb450310f1697d03e9
この記事でtkinterの存在を知ることができました。基本的なことが載っているので、tkinterを使おうかなと思っている人は読んでみるといいと思います。

https://www.lisz-works.com/entry/pyautogui-mouse
このサイトでpyautoguiの存在を知ることができました。基本的なことが載っているので、pyautoguiを使おうかなと思っている人は読んでみるといいと思います。(文章の使いまわしはオブジェクト指向に則っていると感じるのは私だけでしょうか:thinking:

https://codeday.me/jp/qa/20190215/270208.html
after()関数について書かれています。文章は翻訳された日本語のようです。英語を読むよりか断然ましです。

https://codeday.me/jp/qa/20190511/799727.html
上と同じサイトです。Labelの中身を更新する方法について書かれています。現在のコードを書くのに最も貢献してくれました。(今思ったんですけど、こちらはメイン部分でpack()しないでも動くんですよね。私のコードではpack()をしないと動かないんですが:disappointed_relieved:

https://help.qiita.com/ja/articles/qiita-article-guideline
Qiitaのガイドラインです。とりあえず取り急ぎ。

https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0
Wikipediaのフレームの記事です。Frameは炎のことだという勘違いはここで正されました。

#さいごに
pythonでやる前はC#でやっていたんですが、なにがなにやらてんでわからなかったので、情報が豊富そうなpythonに移行したらうまくいきました。pythonは神ですね。

所謂「おまじない」が散見する、というか冒頭でも述べた通り説明が足りない箇所が多い記事になってしまいました。誠にごめんなさい。いろいろおかしい部分があると思いますので訂正コメントなどをしていただけたら幸いです。

目標がマクロを作ることなのでその過程で何かまた書きたくなったら書くと思います。そのときまでに成長していることを願うばかりです。

4
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?