Python | ウィンドウを生成してピクセルを出力する – tkinter

Python には tkinter という標準ライブラリがあり、ベーシックな GUI 関連操作を行うことができます。
この記事では、生成したウィンドウに任意のピクセルマップを出力する例を示します。

目次

ウィンドウを生成して PNG を表示する

まず、PNG の画像ファイルを表示するウィンドウを生成します。
tkinter は Python の標準ライブラリであり、追加パッケージのインストールは不要です。

Python
import tkinter

root = tkinter.Tk()
root.title("Test")

width = 500
height = 500

image = tkinter.PhotoImage(file="python-logo.png")
label = tkinter.Label(root, image=image)
label.pack()

root.mainloop()

ここで、PhotoImage クラスは画像ファイルを読み込んでウィンドウに出力する機能です。
カレントディレクトリに、file 引数で指定した画像ファイルを配置して実行すると、次のようなウィンドウがポップアップします。

WSL でエラーが発生する場合

WSL でプログラムを実行する場合、次のように tkinter が見つからない旨のエラーが発生する可能性があります。

Plaintext
Traceback (most recent call last):
  File "/home/gari/sandbox/main.py", line 1, in <module>
    import tkinter
ModuleNotFoundError: No module named 'tkinter'

この場合はライブラリが不足していますので、次のコマンドで tkinter をインストールしましょう。

Bash
$ sudo apt install python3-tk

これで WSL でもウィンドウを表示できるようになります。

空のウィンドウを出力する

今回はピクセル単位の操作を行うことが目的ですので、PNG を出力させる必要はありません。
次のように、ファイル読み込みをせずに大きさだけを指定して PhotoImage を生成することもできます。

Python
import tkinter

root = tkinter.Tk()
root.title("Test")

image = tkinter.PhotoImage(width=500, height=500)

label = tkinter.Label(root, image=image)
label.pack()

root.mainloop()

このプログラムを実行すると、次のように白紙のウィンドウが表示されます。

put メソッドで黒い点で塗りつぶす

PhotoImage の put メソッドで、ピクセル単位でカラーを操作することができます。
以下の例では “black” と色名を指定していますが、”#000000″ といった指定方法も可能です。

Python
import tkinter

root = tkinter.Tk()
root.title("Test")

width = 500
height = 500

image = tkinter.PhotoImage(width=width, height=height)
for w in range(width):
    for h in range(height):
        image.put("black", to=(w, h))

label = tkinter.Label(root, image=image)
label.pack()

root.mainloop()

結果としては、全て黒く塗りつぶされたウィンドウが出力されます。

マンデルブロ集合を描画する

最後に、マンデルブロ集合を描画してみます。
詳細は省略しますが、複素数のある漸化式が収束するかどうかで白黒を塗り分けています。

Python
import tkinter


def is_mandelbrot_element(x, y, max_iter):
    c = complex(x, y)
    z = 0
    for _ in range(max_iter):
        z = z**2 + c
        if abs(z) >= 2:
            return False
    return True


root = tkinter.Tk()
root.title("Test")

x_min = -2
x_max = 0.5
x_width = x_max - x_min
y_height = 2.5

width = 500
height = 500

image = tkinter.PhotoImage(width=width, height=height)
for w in range(width):
    for h in range(height):
        x = x_min + x_width * w / width
        y = -y_height / 2 + y_height * h / height
        if is_mandelbrot_element(x, y, 100):
            image.put("black", to=(w, h))
        else:
            image.put("white", to=(w, h))

label = tkinter.Label(root, image=image)
label.pack()

root.mainloop()

処理の結果として、次のように Wikipedia にあるような図形が生成されます。

  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次