Python学習【365日チャレンジ!】310日目のマスターU(@Udemy11)です。
Youtubeの見すぎで、昨日はホントグダグダになってしまい、計算機アプリの説明が途中で終了してしまいました。
ほんと睡眠はしっかりと取らないといけませんね。
ということで、今日もPython学習を始めましょう。
昨日の復習
昨日は、tkinter
を使って、計算機アプリを作成するコードを解説している途中で睡魔が襲ってきました。
酒井さんの講座の中からサンプルコードを引用させていただき、初期化の__init__()
を解説したところまでで終了しましたが、内容については、昨日の記事を御覧ください。
今日は、昨日の続きで、tkinter
を使った計算機アプリのコードを解説していきます。
input()
def input(self, action):
self.entry.insert(tk.END, action)
input()
は、計算機のボタンの操作をする関数で、引数のaction
を、初期化で定義したentry
(tk.Entry)のinsert()
に渡しています。
ここで定義したinput
関数は最後に記述するcreate_widgets
で活用します。
clear_all()
def clear_all(self):
self.entry.delete(0, tk.END)
ここで定義するclear_all()
は、入力されたentry
の値を最初(0
)から最後(tk.END
)まで削除(delete
)するコードです。
input
と同様に、後に記述するcreate_widgets
で活用します。
clear_one()
def clear_one(self):
txt = self.entry.get()
self.entry.delete(0, tk.END)
self.entry.insert(0, txt[:-1])
clear_all
は、すべての値を削除する関数でしたが、clear_one
は一つずつ値を消去する関数です。
entry.get()
で、entry
の値を取得してtxt
に入れておき、26行目で一旦entry
の値をすべて削除します。
27行目でinsert()
を使って、txt
から最後の1文字をのぞいた値を入れています。
equals()
def equals(self):
self.value = eval(self.entry.get().replace('÷', '/').replace('x', '*'))
self.entry.delete(0, tk.END)
self.entry.insert(0, self.value)
equals
は、計算結果を表示する関数になります。
30行目は、計算した結果をvalue
に代入しているコードですが、演算子の+
と-
は、そのまま計算できますが、÷
と×
は演算子とは認識されないため、/
と*
に置き換える必要があるので、replace
で置き換えて計算しています。
31行目は、すでに解説していますが、entry
を削除して、32行目で値の入ったvalue
を表示しています。
create_widgets()
def create_widgets(self):
file_menu = tk.Menu(self.menu_bar)
file_menu.add_command(label='Exit', command=self.master.quit)
self.menu_bar.add_cascade(label='File', menu=file_menu)
self.entry.grid(row=0, column=0, columnspan=6, pady=3)
self.entry.focus_set()
tk.Button(self.master, text='7', width=3,
command=lambda: self.input(7)).grid(row=1, column=0)
tk.Button(self.master, text='8', width=3,
command=lambda: self.input(8)).grid(row=1, column=1)
tk.Button(self.master, text='9', width=3,
command=lambda: self.input(9)).grid(row=1, column=2)
tk.Button(self.master, text='4', width=3,
command=lambda: self.input(4)).grid(row=2, column=0)
tk.Button(self.master, text='5', width=3,
command=lambda: self.input(5)).grid(row=2, column=1)
tk.Button(self.master, text='6', width=3,
command=lambda: self.input(6)).grid(row=2, column=2)
tk.Button(self.master, text='1', width=3,
command=lambda: self.input(1)).grid(row=3, column=0)
tk.Button(self.master, text='2', width=3,
command=lambda: self.input(2)).grid(row=3, column=1)
tk.Button(self.master, text='3', width=3,
command=lambda: self.input(3)).grid(row=3, column=2)
tk.Button(self.master, text='0', width=3,
command=lambda: self.input(0)).grid(row=4, column=0)
tk.Button(self.master, text='.', width=3,
command=lambda: self.input('.')).grid(row=4, column=1)
tk.Button(self.master, text='x', width=3,
command=lambda: self.input('x')).grid(row=1, column=3)
tk.Button(self.master, text='-', width=3,
command=lambda: self.input('-')).grid(row=2, column=3)
tk.Button(self.master, text='+', width=3,
command=lambda: self.input('+')).grid(row=3, column=3)
tk.Button(self.master, text='÷', width=3,
command=lambda: self.input('÷')).grid(row=4, column=3)
tk.Button(self.master, text='AC', width=3,
command=lambda: self.clear_all()).grid(row=1, column=4)
tk.Button(self.master, text='C', width=3,
command=lambda: self.clear_one()).grid(row=1, column=5)
tk.Button(self.master, text='=', width=6,
command=self.equals).grid(row=4, column=4, columnspan=2)
create_widgets
は、計算機のインターフェイスと各ボタンの値や役割を決める関数です。
35行目で、初期化でインスタンス化したmenu_bar
を継承したtk.Menu
のインスタンスをfile_menu
としています。
36行目と37行目で、ファイルメニューを作っているのですが、36行目ではfile_manu
に終了(quit
)するcommand
を追加して、Exit
と表示できるようにlabel
を指定します。
37行目は、メニューバーにFile
と表示して、展開したメニューに1行前で定義したfile_menu
(Exit
)を表示できるようにします。
39行目で入力欄を表示する位置(row
、column
)と長さ(columnspan
)と余白(pady
)を指定して、40行目のforcus.set
で確定しています。
42行目から85行目で、計算機に表示するボタンとクリックされた時にinput
に渡す値や演算子、処理する関数(clear_all
、clear_one
、equals
)を定義しています。
コードの実行
root = tk.Tk()
app = Application(master=root)
app.mainloop()
最後にroot
を作成して、root
を継承したApplication
インスタンスを作成して、mainloop
でプログラムが終了するまで起動したままにしています。
作成した計算機を使って計算した動画がこちらです。
まとめ
あまりの眠さに耐えられず、2日がかりになってしまいましたが、計算機がきちんと動くとおもしろいんですよね。
コード自体は、酒井さんのコードを写経したものですが、少しだけ変更したところもあります。
元になるサンプルコードがあれば、そのコードを使って、少しずつ変更してみればどこがどうなるのかわかってくるので、どんどんコードをカスタマイズしたり、関数を付け足したりしてみてください。
こんなコードがサラッと書けるようになれば、もっとプログラミングが楽しくなってくると思うので、頑張ってPython学習を継続していこうと思います。
ということで、明日もGood Python!