Почему возникает ошибка ValueError: invalid literal for int() with base 10: ''?

Рейтинг: -1Ответов: 1Опубликовано: 11.01.2023

Вроде строку в число перевел, может последовательность выполнения программы неверна.

Traceback (most recent call last):
  File "H:\Portable Python-3.10.5 x64\Saves\П\нормальное распределение 1.py", line 61, in <module>
    x, y, z, X, Y, mask = makeData()
  File "H:\Portable Python-3.10.5 x64\Saves\П\нормальное распределение 1.py", line 14, in makeData
    a=int(q.get()) #19
ValueError: invalid literal for int() with base 10: ''
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
import tkinter as tk

    win = tk.Tk()
    win.title("Нормальное распределение теплового поля")
    win.geometry ('600x600+600+300')
    win.resizable(False,False)
    
    
    def makeData():
        a=int(q.get()) #19
        b=float(w.get()) #20
        c=int(e.get()) #200
        x0=float(t.get()) #19.3
        y0=float(u.get()) #19.6
        r=float(i.get()) #.1
        
        x = np.linspace(a, b, c)  # создаем массив из 100 чисел float от 19 до 20 с равномернов шагом
        y = np.linspace(a, b, c)
        
        xgrid, ygrid = np.meshgrid(x, y)
    
        
        z = np.random.normal(xgrid, ygrid)
    
    ##    f = 15
    ##    z = 3 + np.sin((f * (xgrid - 19.75)) ** 2 + (f * (ygrid - 19.75)) ** 2)
    
        r = .1  # радиус маски
        X, Y = np.meshgrid(x, y)
        mask = (X - x0) ** 2 + (Y - y0) ** 2 < r ** 2
    
        return xgrid, ygrid, z, X, Y, mask
    
    tk.Label(win, text='Введите начало массива a = ').grid(row=0,column=0,stick='w')
    tk.Label(win, text='Введите конец массива b = ').grid(row=1,column=0,stick='w')
    tk.Label(win, text='Введите количество точек массива:  ').grid(row=2,column=0,stick='w')
    tk.Label(win, text='Центр маски по x от a = ').grid(row=3,column=0,stick='w')
    tk.Label(win, text='Центр маски по y до b = ').grid(row=4,column=0,stick='w')
    tk.Label(win, text='Радиус маски r = ').grid(row=5,column=0,stick='w')
    
    q = tk.Entry()
    w = tk.Entry()
    e = tk.Entry()
    t = tk.Entry()
    u = tk.Entry()
    i = tk.Entry()
            
    q.grid(row=0, column=1)
    w.grid(row=1, column=1)
    e.grid(row=2, column=1)
    t.grid(row=3, column=1)
    u.grid(row=4, column=1)
    i.grid(row=5, column=1)
    
    tk.Button(win, text='Ввести', command=makeData).grid(row=6,column=1)
    
    x, y, z, X, Y, mask = makeData()
        
    fig = plt.figure(figsize=(10, 10))
    axes = plt.axes(projection="3d")
    
    cmap = LinearSegmentedColormap.from_list('red_blue', ['b', 'g', 'y', 'r'], 256)
    
    ##    axes.plot_surface(x, y, z *(1 + mask * 0.75), color='#11aa55', cmap=cmap)
    axes.scatter(x, y, z *(1 + mask * 0.75), c=z *(1 + mask * 0.75), cmap=cmap)
    
    axes.set_xlabel('Ось x')
    axes.set_ylabel('Ось y')
    axes.set_zlabel('Температура')
    
    plt.show()
    win.mainloop()

Ответы

▲ 0Принят

Вы в коде начинаете построение графика до ввода необходимых значений. То есть программа на вход получает пустую строку и не может привести ее к ипу int, что собственно и сказано в ошибки.

Правильно сделать так, чтобы кнопка Ввести вызывала функцию построения графика, т.е. вынести в отдельную функцию Ваш код на 61-75 строках и поменять функцию-обработчик кнопки.

Вот код:

import matplotlib.pyplot as plt
import matplotlib
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
import tkinter as tk

win = tk.Tk()
win.title("Нормальное распределение теплового поля")
win.geometry ('600x600+600+300')
win.resizable(False,False)

def draw_graph():
    x, y, z, X, Y, mask = makeData()

    fig = plt.figure(figsize=(10, 10))
    axes = plt.axes(projection="3d")

    cmap = LinearSegmentedColormap.from_list('red_blue', ['b', 'g', 'y', 'r'], 256)

    ##    axes.plot_surface(x, y, z *(1 + mask * 0.75), color='#11aa55', cmap=cmap)
    axes.scatter(x, y, z *(1 + mask * 0.75), c=z *(1 + mask * 0.75), cmap=cmap)

    axes.set_xlabel('Ось x')
    axes.set_ylabel('Ось y')
    axes.set_zlabel('Температура')

    plt.show()


def makeData():
    a=int(q.get()) #19
    b=float(w.get()) #20
    c=int(e.get()) #200
    x0=float(t.get()) #19.3
    y0=float(u.get()) #19.6
    r=float(i.get()) #.1

    x = np.linspace(a, b, c)  # создаем массив из 100 чисел float от 19 до 20 с равномернов шагом
    y = np.linspace(a, b, c)

    xgrid, ygrid = np.meshgrid(x, y)


    z = np.random.normal(xgrid, ygrid)

##    f = 15
##    z = 3 + np.sin((f * (xgrid - 19.75)) ** 2 + (f * (ygrid - 19.75)) ** 2)

    r = .1  # радиус маски
    X, Y = np.meshgrid(x, y)
    mask = (X - x0) ** 2 + (Y - y0) ** 2 < r ** 2

    return xgrid, ygrid, z, X, Y, mask

tk.Label(win, text='Введите начало массива a = ').grid(row=0,column=0,stick='w')
tk.Label(win, text='Введите конец массива b = ').grid(row=1,column=0,stick='w')
tk.Label(win, text='Введите количество точек массива:  ').grid(row=2,column=0,stick='w')
tk.Label(win, text='Центр маски по x от a = ').grid(row=3,column=0,stick='w')
tk.Label(win, text='Центр маски по y до b = ').grid(row=4,column=0,stick='w')
tk.Label(win, text='Радиус маски r = ').grid(row=5,column=0,stick='w')

q = tk.Entry()
w = tk.Entry()
e = tk.Entry()
t = tk.Entry()
u = tk.Entry()
i = tk.Entry()

q.grid(row=0, column=1)
w.grid(row=1, column=1)
e.grid(row=2, column=1)
t.grid(row=3, column=1)
u.grid(row=4, column=1)
i.grid(row=5, column=1)

tk.Button(win, text='Ввести', command=draw_graph).grid(row=6,column=1)

win.mainloop()