機械系エンジニアの備忘録

20代独身社会人。仕事では機械・機構の研究開発を行っているエンジニアが、自分の専門分野ではないpythonを扱って楽しむブログです。

MENU

【python】【tkinter】【初心者】ボタンを押す度に入力項が1つ出現する機能を作る

tkinterでボタンを押す度に入力項が1つ出現する機能を作る

 

1. はじめに

前回、ボタンを押すと入力項に書かれた数字を読み取り、その数だけ新しい入力項を作成する機能を作りました。

f:id:stjun:20190513230907j:plain

↓前記事

www.stjun.com

 今回はボタンを押す度に,新しい入力項が1つずつ作成されるよう変更してみます。

 

2.コード

import tkinter as tk #tkinterの読み込み
#ウインド(win)を作成
win=tk.Tk()
win.title("Hello world")
win.geometry("500x300") #ウインドの大きさを200×300に設定
#入力項(変数名:Entry_box)の作成
Entry_box=tk.Entry(width=40,foreground='#000000', background='#FFFFFF')
Entry_box.insert(tk.END,"ボタンを押す度に新しい入力項が1つ作成されます")
Entry_box.place(x=50,y=10)
Entry_box_number=[]
#ボタンを押したときに入力項の文字を表示する機能
def display_action():
    Editbox=tk.Entry(width=40)
    Editbox.place(x=50,y=30*(len(Entry_box_number)+0.3)+30)
    Entry_box_number.append(1)  
#ボタン(変数名:Button)の作成
Button=tk.Button(win,width=5,background="#99CCFF",text="ボタン",command=display_action)
Button.place(x=300,y=5)
#ウインドを動かす
win.mainloop()

ボタンを押すとその度に1つだけ新たな入力項が作成されます。下図は3回ボタンを押したときの様子です。

f:id:stjun:20190514231034j:plain

 

3.説明

基本は前記事と同じで、変わった部分は以下です。

Entry_box_number=[]
#ボタンを押したときに入力項の文字を表示する機能
def display_action():
    Editbox=tk.Entry(width=40)
    Editbox.place(x=50,y=30*(len(Entry_box_number)+0.3)+30)
    Entry_box_number.append(1)  

Entry_box_number=[]で空のリストを作成し,ボタンを押すとlen(Entry_box_number)でそのリストの長さ(要素数)を取得しています。はじめはリストは空のためlen(Entry_box_number)は0になります。そのためEditboxのy位置は30*(0+0.3)+30)=39となります。新たなEditboxを作成したら空のリストに1という要素を追加して関数を終了します。

次にボタンが押されたとき、Entry_box_numberの中には1の要素が追加されている、すなわちEntry_box_number=[1,]となっているのでlen(Entry_box_number)でリストの長さ(要素数)を取得するとlen(Entry_box_number)=1になります。そのためEditboxのy位置は30*(1+0.3)+30)=69となりy位置が30づつずれて等間隔で新しいEditboxが作成されます。

 

※注意:例えば,リストを使わずにただの変数を使ってやることもできますが,変数の定義に注意しないとエラーになります。

例えば次のコードを見てください。

Entry_box_number=0
#ボタンを押したときに入力項の文字を表示する機能
def display_action():
      Editbox=tk.Entry(width=40)
      Editbox.place(x=50,y=30*(Entry_box_number+0.3)+30)
      Entry_box_number += 1

 Entry_box_numberに0を代入しておき,関数の終わりに1つずつ足しています。この方法で動きそうですが実はエラーになり動きません。おそらくdisplay_action()内でEntry_box_numberの変数の定義がごっちゃになっているからだと思います。

こちらの方法でやる場合,Entry_box_numberがglobal変数(関数の外にある変数)だと明示してあげれば大丈夫です。例えば以下のように書きます。

Entry_box_number=0
#ボタンを押したときに入力項の文字を表示する機能
def display_action():
      global Entry_box_number
      Editbox=tk.Entry(width=40)
      Editbox.place(x=50,y=30*(Entry_box_number+0.3)+30)
      Entry_box_number+=1 

 

おすすめ書籍 

tkinterは参考書が非常に少ないです、というより日本語の参考書はほぼ皆無です。個人的には以下がお勧めです。

私が勉強していた時は以下のような参考書がなくネットで調べながら苦労してtkinterを覚えましたが、もし当時こんな書籍があったらもっと楽に学べたのに...と思うくらい基本的内容について丁寧に書かれています。

Amazonの月額読み放題サービス「Kindle unlimited」でも読めます。

初回30日間は無料、退会も簡単なので試しに無料体験して読んでみてもよさそうです。

 

4.まとめ

今回はボタンを押す度に新しい入力項を1つ作成する機能を作りました。。

これも、ToDoリストを追加する動作などに使えそうですね。

次回はチェックボックスの使い方について確認してみたいと思います。

 ↓次の記事

www.stjun.com