初心者でもPythonを使ってみよう

趣味と実益を兼ねたPython学習記

【スポンサーリンク】



tkinter 画面のサイズ・位置の設定方法 Python

アプリを作成していると、画面サイズや画面の位置を制御したいということがよく出てきます。

今回は、tkinterのメイン画面を調整する方法について、実際にアプリを作成しながらまとめました。

目次

メイン画面の調整方法

メイン画面のサイズと位置の調整用に.geometry()メソッドが準備されています。

以下の例では、画面サイズを「200x400」、画面の出現位置を「100x300」に設定しています。

単位はすべてピクセルです。

  • 画面サイズ・位置の設定例
import tkinter

root = tkinter.Tk()
root.geometry("200x400+100+300")
root.mainloop()

上記のコードを実行すると、200x400のサイズのメイン画面が、ディスプレイ右上を0として(100, 300)の位置に出現します。

.geometry()に引数を渡さなければ、現在の画面サイズと位置の情報を取得できます。

また、使用しているディスプレイのサイズ情報を取得することも可能です。

  • ディスプレイのサイズ情報の取得
root.winfo_screenwidth()
root.winfo_screenheight()

次からは、これらの機能を用いて実際に簡単なアプリを作成し、使用方法を確認していきます。

アプリ概要(画面サイズの調整)

ボタンを押すと、画面サイズが変化させるアプリを作成します。

以下に、起動時の画面を示します。

f:id:vigilantPotato:20190405225439j:plain

サイズが「400x400」の画面に、ボタンが2つ並べてあります。

タイトルが「50」のボタンをクリックすると、画面サイズの縦横が+50されます。

f:id:vigilantPotato:20190405225619j:plain

また、タイトルが「-50」のボタンをクリックすると、画面サイズの縦横が-50されます。

f:id:vigilantPotato:20190405225525j:plain

ボタンを用いて、メイン画面サイズの操作をすることができました。

コードの解説(画面サイズの調整)

今回は、「tkinter」のほかに「re」モジュールを使用します。

「re」モジュールはPythonの組み込みモジュールで、インストールは不要です。

.geometry()で取得した文字列から、区切り文字を用いてサイズ情報等を抽出する際に使用します。

import tkinter
import re

次は、クリックすると画面サイズを変更するボタンクラスを作成していきます。

クラス名は、「WindowSizeChanger」としました。

class WindowSizeChanger(tkinter.Button):    #1
    def __init__(self, delta, master=None): #2
        super().__init__(master, text=delta, width=15, command=self.change_size)    #3
        self.master = master    #4
        self.delta = delta      #5
    
    def change_size(self):  #6
        w_info = [int(i) for i in re.split("[x+]", self.master.geometry())] #7
        w_info[0] += self.delta #8
        w_info[1] += self.delta #9
        self.master.geometry("{0[0]}x{0[1]}+{0[2]}+{0[3]}".format(w_info))  #10
  1. 画面サイズを変更するボタンクラス(「tkinter.Button」を継承)
  2. 引数にボタンを押したときのサイズ変化量「delta」をとる
  3. ボタンに表示するテキスト、クリック時に実行するメソッドの設定
  4. 「master」をインスタンス変数に設定
  5. 「delta」をインスタンス変数に設定
  6. ボタンクリック時に実行するメソッド
  7. 「re」モジュールを用いてサイズ情報を数値としてリスト化
  8. 画面サイズ(横幅)に、「delta」を加算
  9. 画面サイズ(縦幅)に、「delta」を加算
  10. .geometry()を用いて、画面サイズを設定

7では、.geometry()で取得した画面情報の文字列を、re.splitを用いて区切り文字でリスト化しています。

画面情報の文字列の区切り文字は「x」と「+」なので、"[x+]"と入力しています。

さらに、後程加算をするために、int()を用いて文字列から整数へと変換をしています。

10では、.format()を用いて、.geometry()に渡すための文字列を生成しています。

最後に、上記のボタンクラスのオブジェクトを生成して完了です。

今回は、初期画面サイズを「400x400」とし、クリックすると画面サイズを+50するボタンと、-50するボタンを生成させています。

if __name__ == "__main__":
    root = tkinter.Tk()
    root.geometry("400x400")
    size_up = WindowSizeChanger(master=root, delta=50)
    size_up.pack()
    size_down = WindowSizeChanger(master=root, delta=-50)
    size_down.pack()
    root.mainloop()

アプリ概要(画面位置の調整)

次は、メイン画面の位置を変化させるアプリを作成します。

以下に、起動時の画面を示します。

f:id:vigilantPotato:20190405231027j:plain

タイトルが、「C」「U」「D」「L」「R」の5つのボタンが並べてあります。

「C」ボタンをクリックすると、メイン画面はディスプレイの中央に移動します。

f:id:vigilantPotato:20190405231053j:plain

「U」ボタンをクリックすると、メイン画面がディスプレイの上部へ移動します。

f:id:vigilantPotato:20190405231123j:plain

同様に、「D」「L」「R」ボタンをクリックすると、それぞれディスプレイ下部、左側、右側へとメイン画面が移動します。

メイン画面の位置の制御をすることができました。

コードの解説(画面位置の調整)

インポートするモジュールは先ほどと同じなので省略します。

クリックすると画面位置を変更するボタンクラスを作成していきます。

クラス名は、「WindowPositionChanger」としました。

class WindowPositionChanger(tkinter.Button):    #1
    def __init__(self, pos, master=None):   #2
        super().__init__(master, text=pos, width=15, command=self.change_pos)   #3
        self.master = master
        self.pos = pos  #4
    
    def change_pos(self):   #5
        w_info = [int(i) for i in re.split("[x+]", self.master.geometry())]

        if self.pos == "C": #6
            x = self.winfo_screenwidth() / 2 - w_info[0] / 2
            y = self.winfo_screenheight() / 2 - w_info[1] / 2
        elif self.pos == "U":
            x = w_info[2]
            y = 0
        elif self.pos == "D":
            x = w_info[2]
            y = self.winfo_screenheight() - w_info[1] - 30
        elif self.pos == "L":
            x = 0
            y = w_info[3]
        elif self.pos == "R":
            x = self.winfo_screenwidth() - w_info[0]
            y = w_info[3]
        else:
            exit()
        
        w_info[2] = int(x)
        w_info[3] = int(y)
        self.master.geometry("{0[0]}x{0[1]}+{0[2]}+{0[3]}".format(w_info))
  1. 画面位置を変更するボタンクラス(「tkinter.Button」を継承)
  2. 引数に画面の位置「pos」をとる
  3. ボタンに表示するテキスト、クリック時に実行するメソッドの設定
  4. 「pos」をインスタンス変数に設定
  5. ボタンクリック時に実行するメソッド
  6. 「pos」の値別に、画面位置を計算

6では、.winfo_screenheight.winfo_screenwidthを用いてディスプレイサイズを取得し、.geometryで取得したメイン画面サイズと合わせて画面位置の計算をしています。

最後に、各ボタンを生成すれば完了です。

if __name__ == "__main__":
    root = tkinter.Tk()
    pos = ["C", "U", "D", "L", "R"] #1
    for p in pos:   #2
        b = WindowPositionChanger(master=root, pos=p)
        b.pack()
    root.mainloop()
  1. 各ボタンのタイトルリスト
  2. for文でボタンを生成

コード全文

  • サイズ設定
import tkinter
import re


class WindowSizeChanger(tkinter.Button):
    def __init__(self, delta, master=None):
        super().__init__(master, text=delta, width=15, command=self.change_size)
        self.master = master
        self.delta = delta
    
    def change_size(self):
        w_info = [int(i) for i in re.split("[x+]", self.master.geometry())]
        w_info[0] += self.delta
        w_info[1] += self.delta
        self.master.geometry("{0[0]}x{0[1]}+{0[2]}+{0[3]}".format(w_info))


if __name__ == "__main__":
    root = tkinter.Tk()
    root.geometry("400x400")
    size_up = WindowSizeChanger(master=root, delta=50)
    size_up.pack()
    size_down = WindowSizeChanger(master=root, delta=-50)
    size_down.pack()
    root.mainloop()
  • 位置設定
import tkinter
import re


class WindowPositionChanger(tkinter.Button):
    def __init__(self, pos, master=None):
        super().__init__(master, text=pos, width=15, command=self.change_pos)
        self.master = master
        self.pos = pos
    
    def change_pos(self):
        w_info = [int(i) for i in re.split("[x+]", self.master.geometry())]

        if self.pos == "C":
            x = self.winfo_screenwidth() / 2 - w_info[0] / 2
            y = self.winfo_screenheight() / 2 - w_info[1] / 2
        elif self.pos == "U":
            x = w_info[2]
            y = 0
        elif self.pos == "D":
            x = w_info[2]
            y = self.winfo_screenheight() - w_info[1] - 30
        elif self.pos == "L":
            x = 0
            y = w_info[3]
        elif self.pos == "R":
            x = self.winfo_screenwidth() - w_info[0]
            y = w_info[3]
        else:
            exit()
        
        w_info[2] = int(x)
        w_info[3] = int(y)
        self.master.geometry("{0[0]}x{0[1]}+{0[2]}+{0[3]}".format(w_info))


if __name__ == "__main__":
    root = tkinter.Tk()
    pos = ["C", "U", "D", "L", "R"]
    for p in pos:
        b = WindowPositionChanger(master=root, pos=p)
        b.pack()
    root.mainloop()