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()
コメント
コメントを投稿