Привет и добро пожаловать в stackoverflow.
Вы столкнулись со следующей проблемой:
Пользователь вводит некоторый текст. Например 5, 6, 12, 5.3
. Ваша программа читает этот текст в строке get1 = e1.get()
. Теперь переменная get1
становится строкой "5, 6, 12, 5.3"
. Но вам нужен список! Вы хотите иметь переменную, равную [5, 6, 12, 5.3]
.
Это означает, что вы должны разобрать строку get1
в список чисел. Это очень сложная задача! Но есть и хорошие новости: Python может сделать это за вас!
Импортировать модуль ast
. Используйте функцию ast.literal_eval
.
Вы можете применить его следующим образом:
x1 = ast.literal_eval(get1)
x1 = list(x1)
Вторая строка x1 = list(x1)
гарантирует, что x1
действительно список. Потому что возможно, что пользователь вводит только «5», а не «5,6».
Теперь мы можем рассчитать и отобразить значения y следующим образом:
ys = [x * 2 for x in x1]
plt.plot(xs, ys, marker=".")
Возможно также, что пользователь допускает другие ошибки. Он может ввести что-то глупое, как «5, привет!, 7,8».
Итак, нам нужна обработка исключений. Я сделал это для вас в следующем примере. Я также переименовал несколько ваших переменных. И я использую некоторые операторы print
, чтобы упростить понимание происходящего.
import ast
from tkinter import messagebox
import matplotlib.pyplot as plt
import numpy as np
import tkinter
from tkinter import *
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.figure import Figure
root = Tk()
fig = Figure(figsize=(5, 4), dpi=100)
class Win1:
def start1():
window1 = tkinter.Toplevel()
Label(window1, text="Zadej hodnoty x, pro které chceš vypočítat").grid(row=0)
global e1
e1 = Entry(window1)
e1.grid(row=0, column=1)
fw = tkinter.Button(window1, text="vykresli", command=Win1.vykreli1)
fw.grid(row=0, column=2)
def vykreli1():
user_input = e1.get()
print(f"user entered '{user_input}'")
if not user_input.strip():
messagebox.showerror("Missing entry", "You did not enter any text")
return
try:
processed_user_input = ast.literal_eval(user_input)
print(f"processed_user_input: {processed_user_input}")
xs = list(processed_user_input)
except Exception as e:
print(f"parsing error {e}")
messagebox.showerror("Unparsable", "Please enter a list of numbers like 5,6.0,20,50.2")
return
ys = [x * 2 for x in xs]
plt.plot(xs, ys, marker=".")
plt.show()
if __name__ == '__main__':
pica = Win1
f1 = tkinter.Button(root, text="try1", command=pica.start1)
f2 = tkinter.Button(root, text="try2")
f1.pack()
f2.pack()
root.mainloop()
Мне удалось запустить эту программу. Я мог ввести несколько цифр, и затем я увидел график.