Only4You, и снова: в одну сторону - не проблема. А вот "и наоборот" намекает, что у тебя неправильно распределены обязанности по классам. Кто-то из них занимается не своим делом. Может даже оба, такое бывает.
Если это два разных компонента, то наладить взаимодействие между ними - задача App.
Если не два компонента, а один, он должен быть оформлен как один класс который внутри себя уже налаживает взаимодействие между своими "подчинёнными".
Я бы вообще сделал вот так
from tkinter import *
from tkinter import ttk
class App(Tk):
def __init__(self, parent):
super().__init__()
self.title('Main window')
self.geometry('400x350+800+400')
self.__put_frames()
def __put_frames(self): # наш, приватный метод - не надо выставлять его наружу
self.statusbar = Statusbar(self)
self.statusbar.grid(row=1, column=0, columnspan=3)
self.footerbar = Footterbar(self)
# передаём метод, который надо вызвать
# footerbar всё равно не имеет понятия, чей это метод
# он только знает, что его надо вызвать по клику на кнопку 6
# мы могли бы создать метод в App и передать его, это бы тоже сработало
# собственно, задача App - связать два компонента между собой
self.footerbar.button6_clicked = self.statusbar.refresh
self.footerbar.grid(row=2, column=0, columnspan=3)
class Statusbar(Frame):
"""Этот класс реализует строку состояния, которая умеет показывать текст."""
def __init__(self, parent):
super().__init__(parent)
self.__put_widgets()
def __put_widgets(self): # наш, приватный метод - не надо выставлять его наружу
self.txt = Text(self, height=15, width=35)
self.txt.grid(row=1, column=0, columnspan=3)
def refresh(self):
self.txt.delete(1.0, END)
self.txt.insert(END, "Updated content")
class Footterbar(Frame):
"""Этот класс реализует панель с нажимаемыми кнопками, и позволяет отреагировать на их нажатие"""
def __init__(self, parent): # мы ничего не знаем про статусбар
super().__init__(parent)
self.button6_clicked = None # тут будет храниться ссылка на метод
self.__put_widgets()
def __button6_click(self):
if self.button6_clicked is not None: # у нас есть что вызывать?
self.button6_clicked() # да - вызываем
def __put_widgets(self): # наш, приватный метод - не надо выставлять его наружу
self.btn4 = ttk.Button(self, text='4')
self.btn4.grid(row=10, column=0)
self.btn5 = ttk.Button(self, text='5')
self.btn5.grid(row=10, column=1)
self.btn6 = ttk.Button(self, text='6', command=self.__button6_click)
self.btn6.grid(row=10, column=2)
app = App(Tk)
app.mainloop()
Only4You, погоди, ты реши, какой объект каким владеет.
У тебя statusbar внутри footerbar, или наоборот?
В первом случае footerbar владеет statusbar, и statusbar должен получить ссылку на него как на владельца через параметр __init__(), но не наоборот.
Ну а если statusbar владеет footerbar, то наоборот.
Просто представь, что твой интерфейс - дерево. App - ствол. А как дальше от него ветви идут? "Ветка" всегда получает параметром то, к чему она крепится.
Ланской Кирилл, А ты исходник посмотри. array_equal() еще много чего делает: приводит входные коллекции к массиву (для == и A и B уже должны быть массивами), отдельно обрабатывает ситуацию, когда в массиве есть NaN (простое сравнение считает, что NaN не равно ничему, в т.ч. самому себе). Вот и набегает 30% разницы.
ALEXU83, тут вообще нужно уточнить, что тебе нужно.
Просто размножить поток на несколько клиентов, и пусть они сами разбираются? Или иметь какую-то историю? И должна ли история быть персистентной, т.е. переживать перезапуск?
Потому что в первом случае по идее можно разрулить без БД, достаточно иметь словарь "тикер-вебсокеты". Поступила новая запись, смотрим её тикер, смотрим, кто вот прямо сейчас имеет активный вебсокет и подписан на этот тикер, рассылаем. Как на питоне это соорудить, я примерно могу представить, а вот на пхп, извини, не мой профиль.
А насчёт мощности, извини, встречный вопрос: сколько клиентов у тебя будет? Потому что единицы записей в секунду - это не сказать чтобы супер много. Если клиентов в пределах сотни, то ИМХО можно оба сервиса на одной vps запустить, и ещё резерв останется.
smit_emae, для начала - написать, как называется библиотека, на которой ты пишешь бота, и её версию. Эту инфу вообще полезно в вопрос добавлять, а то пока нагуглишь, какая из них при импорте называет себя telegram...
1parahon, я не загадками говорю, а пытаюсь показать, как и где искать ответ. Чтобы в следующий раз ты мог найти его сам.
Да, я мог бы сказать "в секции advanced должен быть параметр hidden imports, впиши туда имя модуля, а если его нет - то посмотри внизу, там где приведена полная командная строка для вызова pyinstaller, и попробуй добавить туда --hidden-import имя.модуля перед запуском".
Но одно дело - сделать по бумажке, другое - сделать, понимая, что ты делаешь и почему.
minamisa, что-то у тебя первый код кривой, как не знаю что.
Отступы куда-то подевались, подчёркивания вокруг названия __init__() куда-то подевались, в цикле создаёшь слои одного и того же размера, а их размер должен уменьшаться. Вполне очевидно, что первый и последний слой должны быть вне цикла, так как их размеры не вписываются в логику "19, 18, ..., 11". В общем, исправляй сначала это.
temik2898, а ты посмотри внимательно. Кнопку </> в редакторе текста видишь? А кнопку-меню ... справа внизу от вопроса? Вот и действуй.
И убедись, что ты запускаешь именно тот код, который показываешь (ну, с поправкой на токен, конечно).
Копаться в коде вряд ли кто-то будет, но можно задать наводящие вопросы.
В первую очередь, ты должен как-то оценивать качество работы каждой "особи" - иными словами, написать какую-то целевую функцию, которая численно выразит, насколько та или иная особь хороша.
Какие факторы ты учитываешь в этой функции, и как она в целом выглядит?
U235U235, я про выход слоя 4. ОП не привёл никаких подсказок, как должен выглядить слой out, так что нельзя определить, сколько выходов должно быть в слое 4 - только число входов.
EDIT: ой, блин, я невнимательный. Не увидел, что слои идут не 1->2->3->4, а 4->3->4.
Everything_is_bad, как я понял, schedule и aioschedule всё-таки ориентируются на задачи вида "делай X каждые Y часов/минут/секунд". Такие задачи могут быть просто пересозданы при перезапуске программы, и все дела. Для разовых задач с длительным (дни/недели/месяцы) ожиданием нужна персистентность созданных задач, а я в их доках не увидел никакой поддержки персистентности (хотя может плохо смотрел).
Так что, боюсь, эти либы тут не очень-то помогут. Разве что периодическую проверку "не пора ли напоминать" через них делать, но если других периодических задач в системе нет, то это оверкилл.
zven_bpe, я бы использовал для ожидания не asyncio.sleep(), а asyncio.Event.wait() завёрнутое в asyncio.wait_for(). Тогда, чтобы прервать сон, достаточно взвести этот event.
Если это два разных компонента, то наладить взаимодействие между ними - задача App.
Если не два компонента, а один, он должен быть оформлен как один класс который внутри себя уже налаживает взаимодействие между своими "подчинёнными".