尝试从函数中放入标签文本时遇到问题

时间:2020-02-16 11:13:21

标签: python tkinter

我正在用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()

2 个答案:

答案 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函数的局部变量,因此全局调用它没有任何意义