GUIコンポーネント・ウィジェット100本ノック2本目

 import tkinter as tk

from tkinter import ttk


def show_knock():

    for child in container.winfo_children():

        child.destroy()

    

    name = combo.get()

    

    # キャンバスを基本の土台として生成

    cv = tk.Canvas(container, width=300, height=200, bg="white", highlightthickness=1, highlightbackground="gray")


    # --- 100本ノック 第2セット メインロジック ---

    if name == "11. Canvas (直線)":

        cv.create_line(50, 50, 250, 150, fill="blue", width=5)

        w = cv

    

    elif name == "12. Canvas (点線/破線)":

        cv.create_line(50, 100, 250, 100, dash=(5, 2), width=2)

        w = cv

        

    elif name == "13. Canvas (長方形)":

        cv.create_rectangle(50, 50, 250, 150, outline="red", fill="yellow", width=3)

        w = cv

        

    elif name == "14. Canvas (円/楕円)":

        cv.create_oval(75, 25, 225, 175, fill="lightgreen")

        w = cv

        

    elif name == "15. Canvas (多角形)":

        # 三角形を描画

        cv.create_polygon(150, 30, 250, 170, 50, 170, fill="purple", outline="black")

        w = cv

        

    elif name == "16. Canvas (円弧/扇形)":

        cv.create_arc(50, 50, 250, 150, start=0, extent=150, fill="orange")

        w = cv

        

    elif name == "17. Canvas (文字描画)":

        cv.create_text(150, 100, text="Hello Canvas", font=("Times", 20, "italic"), fill="darkblue")

        w = cv

        

    elif name == "18. Canvas (矢印)":

        cv.create_line(50, 150, 250, 50, arrow=tk.LAST, arrowshape=(16, 20, 6), width=2)

        w = cv

        

    elif name == "19. Canvas (タグによる一括変更)":

        # 同じタグをつけておき、後で色を変えるなどの操作ができる

        cv.create_oval(50, 50, 100, 100, fill="gray", tags="group1")

        cv.create_oval(150, 50, 200, 100, fill="gray", tags="group1")

        cv.itemconfig("group1", fill="cyan") # タグで指定して色を変更

        w = cv


    elif name == "20. Canvas (自由曲線/簡易お絵描き)":

        def draw(event):

            x, y = event.x, event.y

            cv.create_oval(x-2, y-2, x+2, y+2, fill="black", outline="black")

        

        cv.bind("<B1-Motion>", draw) # マウス(指)を動かした時に描画

        cv.create_text(150, 20, text="指でなぞってみてください", font=("Arial", 8))

        w = cv


    w.pack(pady=10)

    container.update()


# --- ベース画面 ---

root = tk.Tk()

root.title("Tkinter 100本ノック 第2章")

root.geometry("400x550")


knock_list = [

    "11. Canvas (直線)", "12. Canvas (点線/破線)", "13. Canvas (長方形)",

    "14. Canvas (円/楕円)", "15. Canvas (多角形)", "16. Canvas (円弧/扇形)",

    "17. Canvas (文字描画)", "18. Canvas (矢印)", "19. Canvas (タグによる一括変更)",

    "20. Canvas (自由曲線/簡易お絵描き)"

]


combo = ttk.Combobox(root, values=knock_list, state="readonly", width=30)

combo.set("ノックを選択してください")

combo.pack(pady=20)


tk.Button(root, text="描画実行!", command=show_knock, bg="cyan").pack()


container = tk.Frame(root, bd=2, relief="sunken", width=320, height=250)

container.pack(pady=20)

container.pack_propagate(False)


root.mainloop()


コメント

このブログの人気の投稿

ミライアイ内服薬は薬事法違反で、ほとんど効果がない詐欺ですか?

最高裁での上告理由書受理・却下の判断基準について

裁判官の忌避申立書の作成例