Получаю ошибку при запуске программы TypeError: get_data_plot() missing 1 required positional argument: 'timespan'

Получаю ошибку при запуске программы:

TypeError: get_data_plot() missing 1 required positional argument: 'timespan'.

Я так понимаю интерпретатор хочет от меня получить на вход переменную timespan? Но так не работает

import sys
from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout, QHBoxLayout, QLineEdit
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt
from datetime import datetime
import requests


class MainWindow(QDialog):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.init_main()

    def init_main(self):
        self.figure = plt.figure()   
        self.canvas = FigureCanvas(self.figure)
        self.btn_timespan_1_year = QPushButton('1 год')
        self.btn_timespan_1_year.clicked.connect(lambda: self.get_data_plot('1year'))
        self.btn_timespan_3_years = QPushButton('3 года')
        self.btn_timespan_3_years.clicked.connect(lambda: self.get_data_plot('3year'))
        self.btn_plot = QPushButton('Построить график')
        self.btn_plot.clicked.connect(self.plot)
        vertical_layout = QVBoxLayout()      
        horizontal_layout = QHBoxLayout()
        horizontal_layout.addWidget(self.btn_timespan_1_year)
        horizontal_layout.addWidget(self.btn_timespan_3_years)
        horizontal_layout.addWidget(self.btn_plot)    
        vertical_layout.addLayout(horizontal_layout)
        vertical_layout.addWidget(self.canvas)    
        self.setLayout(vertical_layout)

    def get_data_plot(self, timespan):     
        url = 'https://api.blockchain.info/charts/market-price'
        params = {'timespan': '', 'rollingAverage': '8hours', 'format': 'json'}
        params['timespan'] = timespan
        response = requests.get(url, params=params)
        data = response.json()
        return data

    def data_plot(self):
        data = self.get_data_plot()
        x_list = []
        y_list = []
        for item in data["values"]:
            x_list.append(datetime.utcfromtimestamp(item['x']))
            y_list.append(item['y'])
        return x_list, y_list
    
    def plot(self):
        self.figure.clear()
        ax = self.figure.add_subplot(111)
        plt.title('График рыночной стоимости Bitcoin', fontsize=14, fontweight='bold', color='blue')
        plt.xlabel('Период, год', fontsize=12, color='black')
        plt.ylabel('Рыночная стоимость, $', fontsize=12, color='black')
        ax.grid()
        ax.plot(*self.data_plot(), label="Рыночная цена")
        ax.legend()
        self.canvas.draw()
    
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MainWindow()
    main.resize(1280, 720)
    main.show()
    sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

я отметил для вас строки, в которые надо внести изменения:

import sys
import requests
from datetime import datetime
from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout, QHBoxLayout, QLineEdit
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt


class MainWindow(QDialog):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.init_main()

    def init_main(self):
        self.figure = plt.figure()   
        self.canvas = FigureCanvas(self.figure)
        self.btn_timespan_1_year = QPushButton('1 год')
        self.btn_timespan_1_year.clicked.connect(lambda: self.get_data_plot('1year'))
        self.btn_timespan_3_years = QPushButton('3 года')
        self.btn_timespan_3_years.clicked.connect(lambda: self.get_data_plot('3year'))
        self.btn_plot = QPushButton('Построить график')
        self.btn_plot.clicked.connect(self.plot)
        vertical_layout = QVBoxLayout()      
        horizontal_layout = QHBoxLayout()
        horizontal_layout.addWidget(self.btn_timespan_1_year)
        horizontal_layout.addWidget(self.btn_timespan_3_years)
        horizontal_layout.addWidget(self.btn_plot)    
        vertical_layout.addLayout(horizontal_layout)
        vertical_layout.addWidget(self.canvas)    
        self.setLayout(vertical_layout)
        
        self.data = None                                                       # +++

    def get_data_plot(self, timespan): 
        url = 'https://api.blockchain.info/charts/market-price'
        params = {'timespan': '', 'rollingAverage': '8hours', 'format': 'json'}
        params['timespan'] = timespan
        response = requests.get(url, params=params)
        self.data = response.json()                                             # self.data
# ---        return data

    def data_plot(self):
# ---        data = self.get_data_plot()
        x_list = []
        y_list = []
        for item in self.data["values"]:                                        # self.data
            x_list.append(datetime.utcfromtimestamp(item['x']))
            y_list.append(item['y'])
        return x_list, y_list
    
    def plot(self):
        self.figure.clear()
        ax = self.figure.add_subplot(111)
        plt.title('График рыночной стоимости Bitcoin', fontsize=14, fontweight='bold', color='blue')
        plt.xlabel('Период, год', fontsize=12, color='black')
        plt.ylabel('Рыночная стоимость, $', fontsize=12, color='black')
        ax.grid()
        ax.plot(*self.data_plot(), label="Рыночная цена")
        ax.legend()
        self.canvas.draw()
    
    
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MainWindow()
    main.resize(1280, 720)
    main.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка