У меня проблемы, когда я пытаюсь поместить текст метки из функции - PullRequest
0 голосов
/ 16 февраля 2020

Я делаю калькулятор с Python 3.8 и Visual Studio. Я пытаюсь напечатать результат в метке при нажатии кнопки.

Это ошибка:

неопределенная переменная 'resultado' pylint (undefined-variable) [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 голосов
/ 16 февраля 2020

Есть несколько ошибок


resultado является локальной переменной - вы должны создать ее вне функции


IntVar(), (StringVar(), et c.) Не является нормальной переменной, и для работы с ней требуется .get(), .set()

resultado.set( int(num1) + int(num2) )

print( resultado.get() )

Button не работает как input() - не работает дождитесь ответа, чтобы создать текст Label( text=), прежде чем вводить текст и нажимать кнопку. Вы можете использовать textvarable=, чтобы назначить IntVar() (StringVar(), и т. Д. c.), И когда вы измените значение в IntVar, он изменит текст на метке.


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 - Руководство по стилю для Python Код

0 голосов
/ 16 февраля 2020

Я не знаком с синтаксисом tkinter, но text=resultado выглядит как проблема. Эта переменная является локальной для функции operar, поэтому нет смысла вызывать ее глобально

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...