Передать значение переменных из одной функции в другую
как передать значения x_list, y_list из функции get_data_plot в функцию plot, внутри одного класса, чтоб построить график??
class MainWindow(QDialog):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
...
# инициализация GUI
...
def get_data_plot(self):
url = 'https://api.blockchain.info/charts/market-price'
params = {'timespan': '10year', 'rollingAverage': '8hours', 'format': 'json'}
response = requests.get(url, params=params)
data = response.json()
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)
self.canvas.draw()
Ответы (5 шт):
вообще-то это самые азы любого языка, но если вы просите именно так, то
plot(get_data_plot())
Еще как вариант:
a, b = get_data_plot()
plot(a, b)
или сразу вызвать в функции
def get_data_plot(self):
# Ваш код...
self.plot(x_list, y_list)
Вы можете определить переменные x_list, y_listкак атрибуты класса, далее доставать их в функциях используя атрибут класса self.
Пример кода класса, который вы можете использовать.
class ClassName:
x_list = [] # ваши переменный в области видимости имен класса
y_list = []
def get_data_plot(self):
...
self.x_list.append('some data') # тут добавляете элемент в список
self.y_list.append('some data')
def plot(self, x_list, y_list):
...
ax.plot(self.x_list, self.y_list)
...
... - часть кода не переписывал
Ну может тогда так:
def plot(self):
ax = self.figure.add_subplot(111)
x_list, y_list = self.get_data_plot()
ax.plot(x_list, y_list)
self.canvas.draw()
Вы вообще где и как этот plot вызываете?
Вызов внутри класса
Если вам надо вызывать функции класса внутри класса, то вам надо написать что-то такое:
self.<имя функции>(<аргументы функции>) т.е. всё тоже самое, как с обычными функциями, только добавить self. впереди.
Пример:
class Foo:
def print_test(self):
print("test")
def call_print_test(self):
self.print_test() # вызов функции внутри класса
Вызов снаружи класса
Если же вы хотите вызвать функции класса снаружи класса, то вам надо будет написать что-то такое:
<имя экземпляра класса>.<имя функции>(<аргументы функции>).
Пример:
class Foo:
def print_test(self):
print("test")
bar = Foo() # экземпляра класса Foo, имя - bar
bar.print_test() # вызов функции вне класса
Т.к. у функции print_test аргументов нет, то мы просто пишем () для вызова
Пример реализации
Cоответственно, в зависимости от того, что вы хотите получить, вам надо написать либо self.plot(self.get_data_plot(<аргументы функции>)) либо <имя экземпляра класса>.plot(<имя экземпляра класса>.get_data_plot(<аргументы функции>)).
Я бы это положил в функцию, чтобы получилось:
class MainWindow(QDialog):
def __init__(self, parent=None):
...
def get_data_plot(self):
...
return x_list, y_list
def plot(self, x_list, y_list):
...
def create_plot(self):
self.plot(*self.get_data_plot())
window = MainWindow()
window.create_plot() # создаётся график
Также не проблема вызвать create_plot внутри класса (self.create_plot())
Дополнительная информация
В функции create_plot я также использовал распаковку с помощью
*, т.е. get_data_plot выводит кортеж, и чтобы "раскрыть" его в две переменные, как того требует plot, мы используем *.
Вот доки питона об этом. И статья на русском, для удобства.
Больше информации о классах вы можете увидеть в документации питона
Если вам тяжело работать с английский языком, то вам вводная статься о классах на русском
Ремарка
По-хорошему функции класса надо называть методами, но я опустил это в ответе, для простоты понимания.