我正在用Python 3.8和Visual Studio做一个计算器。我正在尝试将结果打印在按钮单击的标签上。
这是错误:
未定义变量'resultado'pylint(未定义变量)[37,32]
这是我的代码:
from tkinter import *
r = Tk()
r.title("CALCULADORA")
def operar(num1, num2, signo):
resultado = IntVar()
if signo == "+":
resultado = num1 + num2
elif signo == "-":
resultado = num1 - num2
elif signo == "/":
resultado = num1 / num2
elif signo == "X":
resultado = num1 * num2
return resultado
textNumUno = Entry(r, width=7)
textNumUno.grid(row=0, column=0)
textOperacion = Entry(r, width=3)
textOperacion.grid(row=0, column=1)
textNumDos = Entry(r, width=7)
textNumDos.grid(row=0, column=2)
btn = Button(r, text="=", width=2, command=operar(textNumUno.get(), textNumDos.get(), textOperacion.get()))
btn.grid(row=0, column=3)
labelResultado = Label(r, text=resultado)
labelResultado.grid(row=0, column=4)
r.mainloop()
答案 0 :(得分:0)
几乎没有错误
resultado
是局部变量-您必须在函数外部创建它
IntVar()
,(StringVar()
等)不是普通变量,它需要.get()
,.set()
才能使用
resultado.set( int(num1) + int(num2) )
print( resultado.get() )
Button
不能像input()
那样工作-它不会等待您的回答,因此在您放置文本并按下按钮之前会创建Label( text=)
。您可以使用textvarable=
来分配IntVar()
(StringVar()
等),当您在IntVar中更改值时,它将更改Label上的文本。
Button
稍后将执行功能,但无法获得结果,因此在return
中使用operar
毫无用处。
command=
需要不带()
和参数(所谓的callback
)的函数名称,以后(当您按下按钮时)它将在此名称上添加()
以执行它。如果必须使用带参数的函数,则可以使用lambda
创建不带参数的函数。
command=lambda:operar(textNumUno.get(), textNumDos.get(), textOperacion.get()))
Entry
给出了您必须转换为int()
(或float()
)的字符串
#from tkinter import * # PEP8: not preferred
import tkinter as tk
# --- functions ---
def operar(num1, num2, signo):
if signo == "+":
resultado.set( int(num1) + int(num2) )
elif signo == "-":
resultado.set( int(num1) - int(num2) )
elif signo == "/":
resultado.set( int(num1) / int(num2) )
elif signo in "*xX":
resultado.set( int(num1) * int(num2) )
# --- main ---
r = tk.Tk()
r.title("CALCULADORA")
resultado = tk.IntVar()
textNumUno = tk.Entry(r, width=7)
textNumUno.grid(row=0, column=0)
textOperacion = tk.Entry(r, width=3)
textOperacion.grid(row=0, column=1)
textNumDos = tk.Entry(r, width=7)
textNumDos.grid(row=0, column=2)
btn = tk.Button(r, text="=", width=2, command=lambda:operar(textNumUno.get(), textNumDos.get(), textOperacion.get()))
btn.grid(row=0, column=3)
labelResultado = tk.Label(r, textvariable=resultado)
labelResultado.grid(row=0, column=4)
r.mainloop()
顺便说一句::关于import *
,请参见PEP 8 -- Style Guide for Python Code
答案 1 :(得分:-1)
我对tkinter
语法不熟悉,但是text=resultado
似乎是一个问题。该变量是operar
函数的局部变量,因此全局调用它没有任何意义