Я получаю следующую ошибку:
Exception in Tkinter callback
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter/__init__.py", line 1705, in __call__
return self.func(*args)
File "/Users/XXXXXXXXXXXXX/Desktop/Python/Test Py/TestGUI.py", line 37, in trans1
print(enter_principal)
NameError: name 'enter_principal' is not defined
В настоящее время я пытаюсь изучить Python, поэтому я бы солгал, если бы сказал, что имею представление о том, что происходит не так. Вот мой исходный код, пытаясь сделать простой калькулятор сложных процентов. Получение этой ошибки, когда я пытаюсь получить ввод от пользователя. Код:
#Importing GUI Module
import tkinter as tk
from tkinter import *
#Creating window
root = tk.Tk()
####Functions#####
#Root screen exit button
def exitroot():
root.destroy()
#principal input
def principal():
#Creating principal window and destroying home window
window = tk.Tk()
exitroot()
#Creating widgets
title_principal = tk.Label(window, text='Please enter your pricipal value: ')
enter_principal = tk.Entry(window)
b1 = tk.Button(window, text='Submit', command=trans1)
title_principal.grid()
enter_principal.grid()
b1.grid()
def trans1():
#temp function for testing purposes
print(enter_principal)
####
#CREATING HOME WINDOW WIDGETS
title_main = tk.Label(root, text = "Compound Intrest Calculator", font=("Arial", 20, 'bold'))
start_button = tk.Button(root, text = "Start", width='6', height='2', command=principal)
exit_button = tk.Button(root, text = "Exit", width='6', height='2', command=exitroot)
credits_main = tk.Label(root, text = "M.CXXXXXXXX 2020", font=("Arial", 8))
#PACKING HOME WINDOW WIDGETS VIA GRID
title_main.grid(row='0', columnspan='2')
start_button.grid(row='1', column='0')
exit_button.grid(row='1', column='1')
credits_main.grid(row='2', columnspan='2')
root.mainloop()
Любая помощь приветствуется! Я извиняюсь, если мой код трудно понять или содержит явные ошибки. Я потратил некоторое время на поиск исправления, но я действительно борюсь, так как ни одно из них не сработало.
@quamrana ааа, есть ли способ сделать это глобальным?
Объявите это global
в начале функции.
Нееет... Как программист, вы должны очень, очень, очень стараться не использовать глобальные переменные.
Вам нужно изменить
b1 = tk.Button(window, text='Submit', command=trans1)
К:
b1 = tk.Button(window, text='Submit', command=lambda: trans1(enter_principal.get()))
Причина в том, что вам нужно передать значение, введенное в tk.Entry
, с помощью enter_principal.get()
.
Lambda
позволяет вызывать функцию только при нажатии кнопки (поскольку команда содержит круглые скобки и поэтому будет вызываться автоматически)
После того, как вы передали это, вы можете передать его в функцию trans1
и распечатать.
def trans1(answer):
# temp function for testing purposes
print(answer)
Большое спасибо! Я очень ценю вашу помощь.
enter_principle является локальной переменной и исчезает после завершения функции.