Исключение в обратном вызове Tkinter: аргумент TypeError: float() должен быть строкой или числом, а не ‘Событием’

#python #tkinter #linear-regression #function-binding

#python #tkinter #линейная регрессия #функция-привязка

Вопрос:

 import tkinter as tk
import tkinter.font as font
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

s_data = pd.read_csv("https://raw.githubusercontent.com/AdiPersonalWorks/Random/master/student_scores - student_scores.csv")

def predicted_score(hour :float):
    X = s_data.iloc[:, :-1].values  
    y = s_data.iloc[:, 1].values 
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) 
    linear_regressor = LinearRegression()  
    linear_regressor.fit(X_train, y_train)   
    y_pred = linear_regressor.predict(X_test)
    marks = linear_regressor.predict(hour)
    return marks

window = tk.Tk()
window.geometry("600x300")
tk.Label(window, text="Marks Predictor", justify= tk.CENTER, font = font.Font(size = 40,weight='bold')).pack()
tk.Label(window, text="Predict Percentage", justify= tk.LEFT, font = font.Font(size = 20,weight='bold')).pack()
hour_input = tk.Entry(window)
hour_input.bind("<Return>",predicted_score)
result_predicted_score = tk.Label(window).pack()
hour_input.pack()

window.mainloop()
  

Приведенный выше код предсказывает оценки учащегося в соответствии с количеством часов, которые он изучил. Прогнозирование выполняется с использованием простой линейной регрессии. Я использовал Tkinter для графического интерфейса. У меня ошибка «TypeError: аргумент float () должен быть строкой или числом, а не «Событием»» при запуске этой программы.

Комментарии:

1. Пожалуйста, всегда указывайте полную трассировку стека, а не только тип ошибки.

Ответ №1:

Когда вы привязываете функцию к событию, функция всегда будет вызываться с объектом, представляющим событие. Однако ваша функция требует, чтобы первый параметр был с плавающей точкой.

Вам нужно либо изменить predicted_score , чтобы принять объект события, либо привязать к другой функции, которая принимает объект события, а затем вызывает predicted_score .

В вашем случае, поскольку время идет от записи, я рекомендую вам использовать специальную функцию. Я предполагаю, что вы хотите отобразить результат result_predicted_score , поэтому функция обратного вызова тоже может это сделать:

 def compute_score(event):
    hour = float(hour_input.get())
    score = predicted_score(hour)
    result_predicted_score.configure(text=str(score))
...
hour_input.bind("<Return>", compute_score)
  

Однако для того, чтобы это работало result_predicted_score , должно быть правильно инициализировано. Вы устанавливаете его на None . Это должно быть определено следующим образом:

 result_predicted_score = tk.Label(windonw)
result_predicted_score.pack()