Python tkinter 文字列を計算式にするeval関数を使ってみた

まくまく
まくまく
文字列を計算式にするeval関数を使ってみました。エントリーボックスに「1+1」と入力して実行すると「2」という答えを返してくれる関数です。Pythonの電卓GUIアプリなどでもよく見る関数ですね。

出力


プログラムを実行するとこのようなウインドウが立ち上がります。上段に計算式、下段にはその計算結果を表示するようにしました。

前回の記事「Python tkinter クラスを用いてフレームやエントリーボックス、ラベル、ボタンなどを表示する方法」で記載したプログラムの一部を変更しただけです。手続き型で書くと、もっとシンプルにできると思います。


上段に計算式を入力して、「計算実行」のボタンを押すと、


下段のエントリーボックスとラベルに計算結果が表示されました。

※結果を2箇所に表示しているのは特に意味はありません。




掛け算、割り算も計算できます。


組み合わせもOKです。計算の順番も問題ありませんね。


括弧にも対応しています。


数値以外が入るとエラーとなります。



サンプルプログラム

#ライブラリのインポート
import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master.geometry("500x200+50+50")
        self.master.title("eval 計算テスト")
        #フレームの作成
        self.frame1 = tk.Frame(self.master, width=480, height=70, padx=10, pady=10, bg="#E6E6E6")
        self.frame1.grid_propagate(False)
        self.frame1.place(x=10, y=10)
        self.frame2 = tk.Frame(self.master, width=480, height=100, padx=10, pady=10, bg="#E6E6E6")
        self.frame2.grid_propagate(False)
        self.frame2.place(x=10, y=90)
        #ウィジェット作成
        self.create_widgets()
        
    def create_widgets(self): 
        #入力用
        self.label1 = tk.Label(self.frame1, text="計算式を入力")
        self.label1.grid(row=0, column=0, sticky=tk.W)
        self.entry1 = tk.Entry(self.frame1, width=30)
        self.entry1.grid(row=1, column=0, sticky=tk.W)
        self.button = tk.Button(self.frame1, text="計算実行")
        self.button.grid(row=1, column=1)
        self.button.bind("", self.click_button)
            
        #貼り付け先
        self.label2 = tk.Label(self.frame2, text="計算結果")
        self.label2.grid(row=0, column=0, sticky=tk.W)
        self.entry2 = tk.Entry(self.frame2, width=30)
        self.entry2.grid(row=1, column=0, sticky=tk.W)
        self.text = tk.StringVar()
        self.label = tk.Label(self.frame2, textvariable=self.text)
        self.label.grid(row=2, column=0, sticky=tk.W, pady=5)
        
    def click_button(self, event):
        en_get = self.entry1.get()
        self.entry2.delete("0", "end")
        self.text.set("")
        ans = eval(en_get)
        self.entry2.insert(0, ans)
        self.text.set(ans)
        
def main():
    root = tk.Tk()
    root.resizable(width=False, height=False)
    app = Application(master=root)
    app.mainloop()

if __name__ == "__main__":
    main()

Python tkinterについてはこちらの記事でまとめています。>>>Python tkinter 使い方まとめ

タイトルとURLをコピーしました