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

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

MENU

【Part4】python3-tkinterの使い方 - ボタンを押すと入力項が出現する機能を作ろう!

【Part4】python3-tkinterの使い方

1.前回のおさらい

前回はボタンを押すと入力項に書かれた文字「ユーザーさんこんにちは!」を取得し、別のウインドで表示する機能を作りました。

f:id:stjun:20190512175024j:plain

(前回までの進捗画面)

今回はボタンを押すと,入力項に書かれた数字の数だけ新たな入力項を出現させる機能を作ってみます。

 

2.完成コード

※赤字が今回追加部分、黒字は前回までの作成部分

なおコピー&ペーストはページ下部にあります。

 <コード部分>

import tkinter as tk #tkinterの読み込み
import tkinter.messagebox as mb 

 

#ウインド(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,"何か入力してください")
Entry_box.place(x=50,y=10)


#ボタンを押したときに新しい入力項を作成する関数
def display_action():
      text=Entry_box.get()
      for i in range(int(text)):
            Editbox=tk.Entry(width=40)
            Editbox.place(x=50,y=30*(i+0.3)+30)

#ボタン(変数名:Button)の作成
Button=tk.Button(win,width=5,background="#99CCFF",text="ボタン",command=display_action)
Button.place(x=300,y=5)


#ウインドを動かす
win.mainloop()

 <コードはここまで>

例えば、入力項に5を代入して水色のボタンを押すと入力項が5つに増えました!

f:id:stjun:20190513230856j:plain

f:id:stjun:20190513230907j:plain

 

<説明>

#ボタンを押したときに新しい入力項を作成する関数

def display_action():

      text=Entry_box.get()
      for i in range(int(text)):
            Editbox=tk.Entry(width=40)
            Editbox.place(x=50,y=30*(i+0.3)+30)

前回との違いはdisplay_action()関数に赤字を追加しただけです。非常に簡単に実装できました。

 

text=Entry_box.get()

意味:入力項に代入された数字を読み取り,textという変数に代入するよ。これは前回と同じで,get()関数で入力項(Entry_box)に書かれた文字を取得しています。

 

for i in range(int(text)):

意味:int(text)の回数だけ,以下のコードを繰り返すよ。textというのは先ほど入力項に書かれた数字(画像だと5)です。しかしfor i in range(text)と書くとエラーになります。これはtext=5ではなくてtext="5"だからです。つまりtextは5という数字ではなくて、"5"という文字を取得しているのです。そのため文字を数字に変換するために、int(text)としています。

またrange()を忘れて、for i in int(text)と書くとエラーになるので忘れずrange()を書きましょう。(自分は良く忘れます...)

 

Editbox=tk.Entry(width=40)
Editbox.place(x=50,y=30*(i+0.3)+30)

意味:幅40,位置はx=50,y=30*(i+0.3)+30に入力項を新たに作成するよ。

これは前回とほとんど同じです。唯一違うのはy=30*(i+0.3)+30ですが、iというのはループの回数です。そのため1回目はy=30*(0+0.3)+30=39、2回目のループではy=30*(1+0.3)+30=69と30ずつyがずれていくため、等間隔に入力項が作成されます。

 

3.まとめと次回

<今回のコード:コピーして使えます>

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,"数字を入力してください")
Entry_box.place(x=50,y=10)


#ボタンを押したときに入力項の文字を表示する機能
def display_action():
    text=Entry_box.get()
    for i in range(int(text)):
        Editbox=tk.Entry(width=40)
        Editbox.place(x=50,y=30*(i+0.3)+30)
    
#ボタン(変数名:Button)の作成
Button=tk.Button(win,width=5,background="#99CCFF",text="ボタン",command=display_action)
Button.place(x=300,y=5)


#ウインドを動かす
win.mainloop()

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

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

次回は一回で何個も入力項を作るのではなく、ボタンを押すたびに1個づつ新しい入力項が出現する機能を作ってみたいと思います。