Python には tkinter という標準ライブラリがあり、ベーシックな GUI 関連操作を行うことができます。
この記事では、生成したウィンドウに任意のピクセルマップを出力する例を示します。
ウィンドウを生成して PNG を表示する
まず、PNG の画像ファイルを表示するウィンドウを生成します。
tkinter は 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 が見つからない旨のエラーが発生する可能性があります。
Traceback (most recent call last):
File "/home/gari/sandbox/main.py", line 1, in <module>
import tkinter
ModuleNotFoundError: No module named 'tkinter'
この場合はライブラリが不足していますので、次のコマンドで tkinter をインストールしましょう。
$ sudo apt install python3-tk
これで WSL でもウィンドウを表示できるようになります。
空のウィンドウを出力する
今回はピクセル単位の操作を行うことが目的ですので、PNG を出力させる必要はありません。
次のように、ファイル読み込みをせずに大きさだけを指定して PhotoImage を生成することもできます。
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″ といった指定方法も可能です。
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()
結果としては、全て黒く塗りつぶされたウィンドウが出力されます。
マンデルブロ集合を描画する
最後に、マンデルブロ集合を描画してみます。
詳細は省略しますが、複素数のある漸化式が収束するかどうかで白黒を塗り分けています。
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 にあるような図形が生成されます。
コメント