つきすけ の コーディング記

細かいところで嫌にならないように、小さいことでも解説していくブログ。たまに関係ないことも書く。

Python の Tkinter でボタンをおすごとにウィジェットを増やす

ボタンを押すごとに、ウィジェットを増やしたい。今回は適当に文字(Label)を増やします。
※python2系の場合はtkinterTkinterに変えてください。

キャンバスとボタンを配置

ここは好きなように適当にやろう。

import tkinter          

window = tkinter.Tk()
window.geometry("400x400")
window.title("Try to click the button")

canvas = tkinter.Canvas(width=410, height=410, background="#ccb")
canvas.place(x=-5, y=-5)

button = tkinter.Button(canvas, text="add", width=5)
button.place(x=200, y=200)                 

window.mainloop()

f:id:Tsukisuke:20200218093620p:plain
ボタンを配置

関数などを用意

今回は、「ウィジェットを増やすための関数 (add_widget) 」と、「ボタンの動作関数 (clicked_button) 」の二つ。追加できるウィジェットの数に上限を儲けたいので、clicked_button関数ではその辺を関しつつ、実際の追加動作はadd_widget関数にさせる。
また、表示個数と表示位置管理のため、プログラムの頭でグローバル変数を二つ宣言する。今回の上限は5個
最後にbuttonに対して関数を紐づけて終了。

以下プログラム全文

import tkinter

num = 0 # 追加したウィジェットの数                   
w_y = 0 # 追加していくウィジェットの縦位置                        

# ウィジェットを増やす関数                                                      
def add_widget(widget):
    global w_y
    w_y = w_y +	60
    widget.place(x=20, y=w_y)

# ボタンの動作関数                                                      
def clicked_button(widget):
    global num
    if num < 5: # 上限5個
        disp_text = str(num+1) + "つ目" # 表示文字列
        text = tkinter.Label(widget, text=disp_text)
        add_widget(text) # 追加関数に投げる
        num = num + 1

window = tkinter.Tk()
window.geometry("400x400")
window.title("Try to click the button")

canvas = tkinter.Canvas(width=410, height=410, background="#ccb")
canvas.place(x=-5, y=-5)

# 下の引数の中にcommandを追加する。
button = tkinter.Button(canvas, text="add", width=5, command=lambda:clicked_button(canvas))
button.place(x=200, y=200)

window.mainloop()

f:id:Tsukisuke:20200218094945g:plain
増える様子

gifが雑すぎて押していなくても増えているように見えるが、ちゃんとボタンをおすごとに増える動作をする。