【问题标题】:How to make expressions in Tkinter Python如何在 Tkinter Python 中制作表达式
【发布时间】:2017-07-25 10:15:20
【问题描述】:

我是 python 编程新手,在使用 Tkinter 开发我的 GUI 的特定部分时遇到了一些问题。

我想要做的是,一个用户可以输入(键入)他的数学方程式的空间,软件使用先前计算的变量进行计算。

我为 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 个入口空间

1st) 如果...

然后...

3rd) 其他...

因此,用户将输入他的条件表达式,软件将完成这项工作。在我看来,另一件重要的事情是,如果用户将“if”空格留空,他只需在“Then...”条目中输入他的表达式,然后按下“计算”按钮或使用语句构建所有表达式。

如果有人可以提供一些关于如何以及做什么的想法......

(如果可能的话,没有类)

我会给出一些例子来举例说明 第一个使用语句:

var = the variable previously calculated and stored in the script 

out = output 

if var >= 10 

then out = 4 

else out = 2 

2nd 如果不使用 using 语句,用户将输入“然后”输入他想要计算的表达式,这将是:

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

同样,这只是为了举例说明...我不需要这个特定的布局。如果有人知道如何更好地构建它,欢迎。

谢谢大家。

【问题讨论】:

  • 你能举一些你的 if-then-else 表达式的例子吗?
  • 当然!我将给出一些情况 1st) 使用 statments var = 先前计算并存储在脚本中的变量 out = output if var >=10 then out = 4 else out = 2 2nd) 不使用语句,用户将输入“Then”输入他想要计算的表达式,然后:Out = (((var)**2) +(2*var))**(1/2) 同样,这只是为了举例说明......我不知道'不需要这个特定的布局。
  • 那么为什么需要 if-then-else 字段呢?据我所知,所有复杂的计算器都使用一个输入字段。
  • 是的,你是对的!也可能是这样。我的问题是从一个条目(它是一个字符串)中获取该值,并使其成为一个函数并计算方程。

标签: python user-interface tkinter statements equations


【解决方案1】:

这是您尝试做的简单版本。

我们需要使用 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 代码块。您必须传入 globals() 参数以确保您的 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()
    

    【讨论】:

    • 在这方面做得很好。我的回答更多是对 OPs cmets 之一的回应,但我喜欢你回答更多:)
    • 谢谢,最好指出应该有某种形式的错误处理,就像您在示例中所做的那样。
    • 是的,由于用户错误,很有可能输入了错误的公式,因此在这里进行错误处理是个好主意。
    猜你喜欢
    • 1970-01-01
    • 2023-02-22
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 2020-06-18
    • 1970-01-01
    相关资源
    最近更新 更多