【问题标题】:I have problems when I try to put the text of the label from a function当我尝试从函数中放置标签文本时遇到问题
【发布时间】:2020-02-16 11:13:21
【问题描述】:

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

【问题讨论】:

标签: python tkinter


【解决方案1】:

错误很少


resultado 是局部变量 - 你必须在函数外部创建它


IntVar()、(StringVar() 等)不是普通变量,需要.get().set() 才能使用

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

print( resultado.get() )

Button 不像 input() 那样工作 - 它不会等待您的回答,因此在您输入文本并按下按钮之前会创建 Label( text=)。您可以使用textvarable= 分配IntVar()StringVar() 等),当您更改 IntVar 中的值时,它将更改 Label 上的文本。


Button 稍后会执行函数,但它不能得到结果,所以在operar 中使用return 是没用的。


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

【讨论】:

    【解决方案2】:

    我不熟悉 tkinter 语法,但 text=resultado 看起来是个问题。该变量是 operar 函数的本地变量,因此全局调用它没有意义

    【讨论】:

      猜你喜欢
      • 2022-10-01
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 2022-10-01
      • 2019-03-04
      • 2022-09-29
      • 2022-11-11
      • 1970-01-01
      相关资源
      最近更新 更多