width Canvas

Canvasとは
線、円、四角形などの描画や画像の表示などをするウェジットです。Canvasの構築です。

import tkinter as tk

if __name__ == '__main__':
    root = tk.Tk()
    root.title('Canvas')
    root.geometry("300x200")

    canvas = tk.Canvas(root)
    canvas.pack()
    #描画をする

    root.mainloop()

おなじコードを実行してもRaspberry PiとWindowsでは違います。

Raspberry Piの方が正しいようです。Canvasの使い方はRaspberry Piで表示した結果を使います。
目次
Raspberry Pi スクリーンショット
直線を描画する create_line
四角形を描画する create_rectangle
円を描画する create_oval
弧の描画 create_arc
多角形の描画 create_polygon
画像の描画 create_image
文字の描画 create_text

Raspberry Pi スクリーンショット
Raspberry Piでは[Print Screen]キー操作で全画面を/home/piに保存します。しかし、[alt]+[Print Screen]で アクティブウィンドウをキャプチャーすることができません。Raspberry Piのキャプチャーをすることがあまりないです。 キャプチャーが必要なときは全画面でキャプチャーして必要なところを切り抜いていました。 この操作は数が多くなると面倒に感じます。
アクティブウィンドウをキャプチャーする方法はないのか?ありました。
scrot
を使います。これがインストールされていない場合は、

sudo apt install scrot
でインストールできます。
最初に一番やりたいことはアクティブウィンドウのキャプチャーです。
 

scrot d 5 -bu -e 'mv $f ~/tkinter/'
d 5 5秒後にキャプチャーします。
'mv $f ~/tkinter/' キャプチャーしたファイルをtkinterに移動します。
この操作後5秒以内にキャプチャーしたいウィンドウをアクティブにします。別に5秒以外の何秒でもOKです。

また、Windowsではできないキャプチャーができます。

scrot -s

タイトルバーと境界を除いたキャプチャーです。

直線を描画する create_line
直線を描画するにはcreate_lineを使います。
create_line(x0, y0, x1, y1, ..., xn, yn, options)
一度に複数の直線を描画できます。
x,yとも0は無効です。
また、root.geometry("300x200") の大きさでx=299, y=199も無効です。これらの座標では境界になっています。つまりx=0,y=0 からx=0、y=199へ直線を描画しようとしても、ここは境界線になっているで表示できません。

import tkinter as tk

if __name__ == '__main__':
    root = tk.Tk()
    root.title('Canvas')
    root.geometry("300x200")

    canvas = tk.Canvas(root, bg="lime green")
    canvas.pack()
    #描画をする
    canvas.create_line(1, 1, 1, 198, 298, 198, 298, 1, 1, 1, fill='red', width=8)

    root.mainloop()

fillで色をwidthで線の太さが変えられます。

四角形を描画する create_rectangle
四角形を描画するにはcreate_rectangleを使います。指定した座標と描画結果は次のようになります。

x2,y2の座標は描画されません。四角形はfill,outline,widthのオプションが使えます。



円を描画する create_oval
円を描画するにはcreate_ovalを使います。これなら分かりやすいと思います。

指定した座標に円が内接します。

import tkinter as tk

if __name__ == '__main__':
    root = tk.Tk()
    root.title('Canvas')
    root.geometry("300x200")

    canvas = tk.Canvas(root, bg="lime green")
    canvas.pack()
    #描画をする
    canvas.create_rectangle(20, 20, 160, 150)
    canvas.create_oval(20, 20, 160, 150, outline='red')
    root.mainloop()
弧の描画 create_arc

弧の描画をするにはcreate_arcを使います。これって案外分かりにくいです。基本的に座標の指定は四角形と同じと解説しているページがありますが、言語明瞭意味不明な解説が多かったです。それでは四角形と同じでやってみます。
ソースです、

import tkinter as tk

if __name__ == '__main__':
    root = tk.Tk()
    root.title('Canvas')
    root.geometry("300x200")

    canvas = tk.Canvas(root, bg="lime green")
    canvas.pack()
    #描画をする
    canvas.create_arc(10, 10, 90, 90)
    root.mainloop()

円を4等分した円弧が描かれでいます。コードと描画がなんだか直感的にわかりません。create_arcにはオプションがいろいろあります。

startは弧の描画を開始する角度です。0度の角度は円の中心から3時の方向です。startから反時計回りが正の角度、時計回りが負の角度になります。何もオプションをつけないとstartの角度が0、extentの角度が90度になっています。形状はstyle=piesliceになっています。そのほか四角形と同じくfill.outline,widthが使えます。フルオプションでやってみます。

    canvas.create_arc(10, 10, 90, 90,
        fill='yellow',outline='blue',width=6, 
        start = 30, extent=160, style='chord')

30度(時計の2時)から160度進んだ180度(時計の9時)まで結んだ弧と直線が描画されています。
style= arcにします。

弧だけの描画になりました。

多角形の描画 create_polygon
多角形を描画するにはcreate_polygonを使います。複数の点を指定すると多角形を描画できます。fillとoutlineが指定できます。

import tkinter as tk

if __name__ == '__main__':
    root = tk.Tk()
    root.title('Canvas')
    root.geometry("300x200")

    canvas = tk.Canvas(root, bg="lime green")
    canvas.pack()
    #描画をする
    canvas.create_polygon(100, 10, 165, 70, 135, 140, 65, 140, 35, 70,
        fill='yellow',outline='red')
    
    root.mainloop()



画像の描画 create_image
画像をs描画するにはcreate_image を使います。用意した画像はこれです。

185ドットX139ドットの大きさです。 この画像を左上に描画するには、縦横それぞれ半分の値をx,yに指定します。

import tkinter as tk

if __name__ == '__main__':
    root = tk.Tk()
    root.title('Canvas')
    root.geometry("300x200")

    canvas = tk.Canvas(root, bg="lime green")
    canvas.pack()
    #描画をする
    image_data = tk.PhotoImage(file = 'ufo.png')
    canvas.create_image(94, 70, image = image_data)    
    
    root.mainloop()

画像が左上にキッチリ描画できました。

文字の描画 create_text
文字の描画をするにはcreate_textを使います。create_image と同じくx,yを文字列の中心としいて表示されます。

import tkinter as tk

if __name__ == '__main__':
    root = tk.Tk()
    root.title('Canvas')
    root.geometry("300x200")

    canvas = tk.Canvas(root, bg="lime green")
    canvas.pack()
    #描画をする
    canvas.create_text(150, 100,  font=("Helvetica", 24, "bold"), 
        fill='red', text='こんにちは', angle=45)    
    
    root.mainloop()

angleで回転もできます。