Python Code Notes

Information by python engineer

【tkinter】 画面サイズ・位置の設定・取得方法【Python】

tkinter画面の位置・サイズの取得・調整が可能なgeometryメソッドの基本的な使い方を整理しました。 また、geometryメソッドと直接関連しませんが、併用することの多いモニターの画面サイズの取得方法についても記載しました。これらを応用したより実践的な使い方は、以下の記事を参照ください。


【スポンサーリンク】


メイン画面のサイズ・位置を設定

トップレベルウィジェット(Tkウィジェット)のgeometryメソッドに値を入力することで、メイン画面のサイズと位置を調整することができます。例えば、300x150のサイズで座標(100, 100)にtkinter画面を出したい場合は、以下の通りgeometryメソッドに文字列で"300x150+100+300"を渡してあげればOKです。

import tkinter

root = tkinter.Tk()                 #トップレベルウィジェット
root.geometry("300x150+100+300")    #画面サイズ、位置の設定
root.mainloop()

上記のコードを実行すると、下図の様に指定したサイズの画面が指定した位置に出現します。

以下の通り、画面サイズだけ、または画面位置だけを指定することも可能です。

root.geometry("300x150") #画面サイズだけを指定
root.geometry("+100+300") #画面位置だけを指定

[↑ 目次へ]


【スポンサーリンク】


メイン画面のサイズ・位置を取得

geometryメソッドに値を渡さずに実行すると、現在の画面サイズ・位置を取得することができます。以下、画面サイズと位置を常にラベルへ表示させる例となります。

How to show main window's size and location

上記のコードを実行すると、画面のサイズと位置を表示したラベルが表示されます。

実行時

画面のサイズや位置を変更すると、それに合わせてラベルに表示される値も変化していきます。

サイズ変更

位置変更

この例では、画面調整時に発生するConfigureイベントを利用して画面情報の取得・表示を実行しています。

[↑ 目次へ]


【スポンサーリンク】


メイン画面のサイズ・位置を個別に取得

geometryはサイズ・位置情報を文字列で一括取得するメソッドですが、各項目を数値で個別に取得する以下のメソッドも準備されています。値が数値で返されるので、何かしら計算をしたい場合はこれらを利用したほうが処理が簡単になるケースが多いです。

  1. 画面幅:winfo_width()
  2. 画面高:winfo_height()
  3. x座標 :winfo_x()
  4. y座標 :winfo_y()

上記メソッドを利用して、先ほどと同じように画面情報をリアルタイムで表示させる例を以下に示します。複数行の情報表示なので、Labelの代わりにMessageを使用しています。数字はgeometryメソッドを利用した場合と同じ値となります。

How to show main window's size and location indiv…

実行するとMessage内に各種画面情報が表示されます。(先ほどと同様にサイズ・位置を変更するとリアルタイムで情報が更新されます。)

画面情報を個別に取得

winfo_x()winfo_y()は厳密には親ウィジェットに対する座標を取得するメソッドで、ボタンなどすべてのウィジェットで使用可能です。今回の様にTkウィジェット(tkinterメイン画面)に対して実行すると、geometryメソッドと同じ座標値を取得することができます。

[↑ 目次へ]


【スポンサーリンク】


モニター画面サイズを取得

winfo_screenwidthwinfo_screenheightメソッドを使用することで、使用しているモニターの横幅と縦幅を取得することができます。以下の例では、これらのメソッドで取得したモニターのサイズをラベルに表示させています。

import ctypes
import tkinter


if __name__ == "__main__":
    ctypes.windll.shcore.SetProcessDpiAwareness(1)
    root = tkinter.Tk()
    screen_info = "width:" + str(root.winfo_screenwidth()) + " height:" + str(root.winfo_screenheight())
    label = tkinter.Label(text=screen_info)
    label.pack()
    root.mainloop()

実行すると、以下の通りデバイスの画面のサイズが表示されます。これらを利用し、tkinterの画面をモニター端に合わせるなどの応用が可能になります。

画面サイズの取得

[↑ 目次へ]


【スポンサーリンク】


メイン画面の位置設定時の注意点

メイン画面の位置(特にx座標)を厳密に設定したい場合は、やや注意が必要な点があります。例えば、メイン画面の左端をモニターの左端に合わせるためにgeometryメソッドでx座標を0に設定しても、下図の様にやや右側に寄ってメイン画面が表示されて隙間ができてしまいます。

x座標がゼロでも隙間ができる

これはTkウィジェットが認識している(geometryメソッドで設定する)モニター上の描画領域と、実際のモニター領域が異なることで発生しており、モニター上の座標を取得するメソッドが別で準備されています。

  1. モニター上のx座標 :winfo_rootx()
  2. モニター上のy座標 :winfo_rooty()

そのため、モニター左端にメイン画面端をピッタリと合わせたい場合は、x座標にwinfo_x()winfo_rootx()で取得した値の差分を設定する必要があります(値はマイナスの数字になります)。具合的な調整方法は以下の記事で紹介していますので参照ください。

www.python-beginners.com

[↑ 目次へ]


【スポンサーリンク】