Найти - Пользователи
Полная версия: Передать значение переменных из одной функции в другую
Начало » Центр помощи » Передать значение переменных из одной функции в другую
1 2
Feelgood
Добрый день.
Как передать значения x_list, y_list из функции get_data_plot в функцию plot, внутри одного класса, чтоб построить график??

 import sys
from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout
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.figure = plt.figure()
        # Canvas Widget отображающий `figure`
        # он принимает экземпляр `figure` в качестве параметра __init__
        self.canvas = FigureCanvas(self.figure)
        # кнопка вызова функции построения графика
        self.button = QPushButton('Построить график')
        self.button.clicked.connect(self.plot(*self.get_data_plot()))
        # создаем вертикальный контейнер и помещаем виджеты
        layout = QVBoxLayout()
        layout.addWidget(self.canvas)
        layout.addWidget(self.button)
        self.setLayout(layout)
    def get_data_plot(self):        
        # запрос и получение данных через API blockchain.com
        url = 'https://api.blockchain.info/charts/market-price'
        params = {'timespan': '10year', 'rollingAverage': '8hours', 'format': 'json'}
        response = requests.get(url, params=params)
        data = response.json()
        # чтение данных из JSON файла
        #with open('market_price.json') as file:
            #data = json.load(file)
        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, x_list, y_list): 
        # создание координатной плоскости
        ax = self.figure.add_subplot(111)
        # построение линейного графика
        ax.plot(x_list, y_list)
        # обновляем canvas
        self.canvas.draw()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())
doza_and
 obj.plot(*obj.get_data_plot())
Feelgood
doza_and
obj.plot(*obj.get_data_plot())
а где вызывать??

Если вызываю
 main.plot(*main.get_data_plot())
после создания экземпляра класса
 main = MainWindow()
то график строится сразу, а не по нажатию кнопки
PEHDOM
Feelgood
а где вызывать??
ну откуда ж нам знать, в вашем коде нет вызова plot(). Там где вы вызываете self.plot(x_lst, y_lst) заменить на self.plot(*self.get_data_plot())
Feelgood
PEHDOM
добавил код целиком в первый пост, подскажите пожалуйста
PEHDOM
Feelgood
добавил код целиком в первый пост, подскажите пожалуйста
не ну так оно не сработает, от слова совем. Сигналы в ПайКуТе чутка по другому работает.
В даном случае вот так:
 self.button.clicked.connect(lambda: self.plot(*self.get_data_plot()))
Хотя в таком виде я вообще не вижу смысла во всем этом. Что вам мешает вызывать get_data_plot() прямо в def plot()? не пердавая ему никаких аргументов?
Типа ax.plot(*self.get_data_plot())
Но это так, может у вас там в дальнейшем он нужно будет именно в таком виде.
Feelgood
PEHDOM
Типа ax.plot(*self.get_data_plot())
к сожалению в данном варианте ошибка
TypeError: plot() missing 1 required positional argument: 'y_list'

  self.button.clicked.connect(lambda: self.plot(*self.get_data_plot()))
данный вариант работает

Что означает “*” перед вызовом функции?
Feelgood
а просто на вход функции d
ef plot(self):
без аргументов
Feelgood
PEHDOM
Спасибо!
Feelgood
Вот итоговый код, может кто-то сделать код ревью??

 import sys
from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout
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.figure = plt.figure()
        # Canvas Widget отображающий `figure`
        # он принимает экземпляр `figure` в качестве параметра __init__
        self.canvas = FigureCanvas(self.figure)
        # кнопка вызова функции построения графика
        self.button = QPushButton('Построить график')
        self.button.clicked.connect(self.plot)
        # создаем вертикальный контейнер и помещаем виджеты
        layout = QVBoxLayout()
        layout.addWidget(self.canvas)
        layout.addWidget(self.button)
        self.setLayout(layout)
    # функция получения данных через API
    def get_data_plot(self):        
        # запрос и получение данных через API blockchain.com
        url = 'https://api.blockchain.info/charts/market-price'
        params = {'timespan': '10year', 'rollingAverage': '8hours', 'format': 'json'}
        response = requests.get(url, params=params)
        data = response.json()
        # чтение данных из JSON файла
        #with open('market_price.json') as file:
            #data = json.load(file)
        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): 
        # создание координатной плоскости
        ax = self.figure.add_subplot(111)
        # построение линейного графика
        ax.plot(*self.get_data_plot())
        # обновляем canvas
        self.canvas.draw()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB