2017-07-25 65 views
1

我是python編程的新手,我在用Tkinter開發GUI的特定部分時遇到了一些問題。如何在Tkinter Python中創建表達式

我想要做的是,一個空間,用戶可以輸入(鍵入)他的數學公式,軟件使用先前計算的變量進行計算。

我發現很多Tkinter的計算器,但沒有一個是我正在尋找的。我沒有太多的類定義經驗。

我做了這個簡單的佈局,以更好地解釋什麼,我想做的事:

import tkinter as tk 

root = tk.Tk() 

Iflabel = tk.Label(root, text = "If...") 
Iflabel.pack() 
IfEntry = tk.Entry(root) 
IfEntry.pack() 

thenlabel = tk.Label(root, text = "Then...") 
thenEntry = tk.Entry(root) 
thenlabel.pack() 
thenEntry.pack() 

elselabel = tk.Label(root, text = "else..") 
elseEntry = tk.Entry(root) 
elselabel.pack() 
elseEntry.pack() 

applybutton = tk.Button(root, text = "Calculate") 
applybutton.pack() 

root.mainloop() 

爲Python 3這個簡單的代碼有3個空間

1)如果...

第二然後...

3)否則...

因此,用戶將輸入他的條件表達和軟件將完成這項工作。在我看來,另一個重要的事情是,如果用戶將「if」空格留空,他只需在「Then ...」輸入內輸入他的表達式,然後按下「calculate」按鈕或使用語句構建所有表達式。

如果有人能提供關於如何以及怎樣做的一些想法....

(無類,如果可能的話)

I'l給出using語句例證 1日一些情況:

var = the variable previously calculated and stored in the script 

out = output 

if var >= 10 

then out = 4 

else out = 2 

第二不使用語句的用戶將輸入「然後」進入了他想表達的計算,這將是:

Then: Out = (((var)**2) +(2*var))**(1/2) 

再說一遍,這只是例證......我不需要這個特定的佈局。如果有人有一個想法如何更好地構建它,是值得歡迎的。

謝謝大家。

+0

你能給你的if-then-else的一些例子表情?當然是 – scotty3785

+0

! I'l給使用statments 變種某些情況下 第一)=先前計算的變量和存儲在腳本 OUT =輸出 如果VAR> = 10 再出= 4 否則OUT = 2 第二)無使用語句 用戶將鍵入「然後」輸入他想要計算的表達式,那將是 Then: Out =(((var)** 2)+(2 * var))**(1/2) 再一次,它只是爲了舉例說明......我不需要這個特定的佈局。 – GabrielBR

+0

那麼爲什麼你需要if-then-else字段呢?據我可以告訴所有複雜的計算器使用一個單一的輸入字段。 –

回答

2

下面是你正在嘗試做的簡單版本。

我們需要使用內置函數eval來評估字符串的數學運算。

我們還應該編寫一些錯誤處理的代碼,因爲有一個非常好的更改,用戶將輸入一個錯誤的公式,並且eval語句將失敗。

欲瞭解更多有關evalexec的信息,請看看這篇文章here。我認爲它解釋這兩個方面做得很好。

這是它會是什麼樣子:

import tkinter as tk 

root = tk.Tk() 

math_label = tk.Label(root, text = "Type formula and press the Calculate button.") 
math_label.pack() 
math_entry = tk.Entry(root) 
math_entry.pack() 
result_label = tk.Label(root, text = "Results: ") 
result_label.pack(side = "bottom") 

def perform_calc(): 
    global result_label 
    try: 
     result = eval(math_entry.get()) 
     result_label.config(text = "Results: {}".format(result)) 
    except: 
     result_label.config(text = "Bad formula, try again.") 


applybutton = tk.Button(root, text = "Calculate", command = perform_calc) 
applybutton.pack() 

root.mainloop() 
2

第一個答案能夠在正確的思想,但它也可以匹配一點更加明確,以你給的例子,如果你想利用這一點更進一步。

基本上你想使用eval語句來測試你的條件,然後使用exec語句來運行你的python代碼塊。你必須在全局傳遞()的參數,以確保您的exec函數修改正確的變量在這種情況下

見下文:

import tkinter as tk 
from tkinter import messagebox 

var = 10 
out = 0 

def calculate(): 
    global out 

    try: 
     if eval(IfEntry.get()): 
      exec(thenEntry.get(), globals()) 
     else: 
      exec(elseEntry.get(), globals()) 
     messagebox.showinfo(title="Calculation", message="out: " + str(out)) 
    except: 
     exc_type, exc_value, exc_traceback = sys.exc_info() 
     msg = traceback.format_exception(exc_type, exc_value, exc_traceback) 
     messagebox.showinfo("Bad Entry", message=msg)    

root = tk.Tk() 

Iflabel = tk.Label(root, text = "If...") 
Iflabel.pack() 
IfEntry = tk.Entry(root) 
IfEntry.insert(0, "var >= 10") 
IfEntry.pack() 

thenlabel = tk.Label(root, text = "Then...") 
thenEntry = tk.Entry(root) 
thenlabel.pack() 
thenEntry.insert(0, "out = 4") 
thenEntry.pack() 

elselabel = tk.Label(root, text = "else..") 
elseEntry = tk.Entry(root) 
elselabel.pack() 
elseEntry.insert(0, "out = 2") 
elseEntry.pack() 

applybutton = tk.Button(root, command=calculate, text = "Calculate") 
applybutton.pack() 


applybutton.focus_displayof 

root.mainloop() 
+0

對此很好的工作。我的回答更多地是迴應OP的一條評論,但我喜歡你回答更多:) –

+0

謝謝,可能很好,指出應該有一些形式的錯誤處理來處理這個問題,就像你在例子中一樣。 –

+0

雅由於用戶錯誤,輸入錯誤公式的機會很大,所以錯誤處理在這裏是一個好主意。 –