Уведомления

Группа в Telegram: @pythonsu

#1 Март 18, 2021 07:39:00

Feelgood
Зарегистрирован: 2016-08-04
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Передать значение переменных из одной функции в другую

Добрый день.
Как передать значения 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_())

Отредактировано Feelgood (Март 18, 2021 19:57:19)

Офлайн

#2 Март 18, 2021 08:20:01

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Передать значение переменных из одной функции в другую

 obj.plot(*obj.get_data_plot())



Офлайн

#3 Март 18, 2021 19:46:38

Feelgood
Зарегистрирован: 2016-08-04
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Передать значение переменных из одной функции в другую

doza_and
obj.plot(*obj.get_data_plot())
а где вызывать??

Если вызываю
 main.plot(*main.get_data_plot())
после создания экземпляра класса
 main = MainWindow()
то график строится сразу, а не по нажатию кнопки

Отредактировано Feelgood (Март 18, 2021 19:52:30)

Офлайн

#4 Март 18, 2021 19:50:49

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Передать значение переменных из одной функции в другую

Feelgood
а где вызывать??
ну откуда ж нам знать, в вашем коде нет вызова plot(). Там где вы вызываете self.plot(x_lst, y_lst) заменить на self.plot(*self.get_data_plot())



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#5 Март 18, 2021 19:57:53

Feelgood
Зарегистрирован: 2016-08-04
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Передать значение переменных из одной функции в другую

PEHDOM
добавил код целиком в первый пост, подскажите пожалуйста

Офлайн

#6 Март 18, 2021 20:06:53

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Передать значение переменных из одной функции в другую

Feelgood
добавил код целиком в первый пост, подскажите пожалуйста
не ну так оно не сработает, от слова совем. Сигналы в ПайКуТе чутка по другому работает.
В даном случае вот так:
 self.button.clicked.connect(lambda: self.plot(*self.get_data_plot()))
Хотя в таком виде я вообще не вижу смысла во всем этом. Что вам мешает вызывать get_data_plot() прямо в def plot()? не пердавая ему никаких аргументов?
Типа ax.plot(*self.get_data_plot())
Но это так, может у вас там в дальнейшем он нужно будет именно в таком виде.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Март 18, 2021 20:14:34)

Офлайн

#7 Март 18, 2021 20:16:51

Feelgood
Зарегистрирован: 2016-08-04
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Передать значение переменных из одной функции в другую

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()))
данный вариант работает

Что означает “*” перед вызовом функции?

Офлайн

#8 Март 18, 2021 20:18:31

Feelgood
Зарегистрирован: 2016-08-04
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Передать значение переменных из одной функции в другую

а просто на вход функции d

ef plot(self):
без аргументов

Офлайн

#9 Март 18, 2021 20:18:44

Feelgood
Зарегистрирован: 2016-08-04
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Передать значение переменных из одной функции в другую

PEHDOM
Спасибо!

Офлайн

#10 Март 18, 2021 20:43:01

Feelgood
Зарегистрирован: 2016-08-04
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Передать значение переменных из одной функции в другую

Вот итоговый код, может кто-то сделать код ревью??

 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_())

Отредактировано Feelgood (Март 18, 2021 20:45:47)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version