Python 3.11.7 (tags/v3.11.7:fa7a6f2, Dec 4 2023, 19:24:49) [MSC v.1937 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> l = locals()
>>> l['x'] = 1
>>> x
1
>>>
wmctrl -c 'Имя моего окна'
должно закрыть первое окно, в заголовке которого встречается подстрока "имя моего окна" без учёта регистра.wmctrl -F -c 'Имя моего окна'
должно закрыть первое окно, заголовок которого в точности равен "Имя моего окна".class MainWindow(tk.Tk):
"""Главное окно приложения."""
def __init__(self):
"""Конструктор вызывается при создании окна"""
super().__init__()
self.title('Моё окно')
self.protocol('WM_DELETE_WINDOW', self.__done) # прописываем реакцию на закрытие окна
... # тут создаёшь элементы управления и проводишь прочую инициализацию
# в том числе создаёшь и запоминаешь вспомогательные окна
def __done(self):
"""Вызовется при попытке закрытия окна"""
... # тут делаешь что тебе нужно при закрытии
# например, закрываешь вспомогательные окна
self.destroy() # если не сделать этот вызов, окно на самом деле не закроется - иногда это нужно
if __name__ == '__main__':
root = MainWindow()
root.mainloop()
def long_worker_thread(event: threading.Event):
... # тут начальная подготовка. имей ввиду, что цикл начнётся с ожидания
while not event.wait(1.0): # ждём пока пройдёт заданное время - или пока event не будет взведено
... # тут работу работаем - но не слишком долго, чтобы проверки event.wait() делались регулярно!
... # завершение. Произойдёт, если был сделан break, или если event было взведено
stop_worker = threading.Event()
thread = threading.Thread(target=long_worker_thread, args=(stop_worker,))
thread.start()
... # что-то делаем пока поток крутится
stop_worker.set() # ожидание в потоке прервётся немедленно, не дожидаясь конца интервала
thread.join() # поэтому можно спокойно дождаться, пока поток не закончит работу - это будет быстро
for _ in range(попыток)
.for _ in range(attempts):
try:
reader, writer = await asyncio.wait_for(
asyncio.open_connection(server, port),
timeout
)
except (asyncio.TimeoutError, Exception):
... # реагируем на ошибку соединения, пишем в лог или ещё что
else:
break # соединение принято
else: # относится к for, выполнится если не было break
... # реагируем на исчерпание попыток
# потом делаем return или throw
# если управление дошло досюда, соединение установлено
... # работаем
Где хранятся все эти значение 1,2,3,4, ведь у моего 'x' нету же звездочки(*х), чтобы собрать столько аргументов.
Return the currently running Task instance, or None if no task is running.
import asyncio
async def print_task():
print(asyncio.current_task())
async def foobar():
await print_task()
async def main():
print('Direct call')
await foobar()
print('create_task')
task = asyncio.create_task(foobar())
await task
# asyncio.run(main()) # даст такой же результат
asyncio.get_event_loop().run_until_complete(main())
fr = f.readlines()
. Он построчно прочитает всё содержимое файла в список, и сохранит список в переменную fr. При этом текущая позиция окажется в конце файла - ты же прочитал всё содержимое.await asyncio.create_task(start_checking_price(1800))
await asyncio.create_task(some_coro(...))
не имеет смысла практически никогда! Если тебе нужно запустить корутину и дождаться результата, делаешь просто await some_coro(...)
.# ...
check_task = asyncio.create_task(start_checking_price(1800)) # нету await, мы не ждём созданную задачу!
try:
await dp.start_polling()
finally:
check_task.cancel() # отменяем корутину
# внутри start_checking_price() текущий выполняемый await выкинет исключение CancelledError
# это исключение всплывёт наружу, если мы сделаем await, и позволит отработать
# блокам finally, with и т.п. инструментам. Также можно явно поймать это исключение,
# чтобы обработать отмену корутины. Но в твоём случае это не требуется.
try:
await check_task # даём корутине отработать завершение
except asyncio.CancelledError: # ловим всплывшее CancelledError
pass # всё ок, никакие действия не требуются
await my_bot.close()
from collections import Counter
from itertools import chain
data = [
(1, 'old;white'),
(2, 'old;green'),
(3, 'old;brown'),
(4, 'new;green'),
]
# генерирует последовательность ['old', 'white'], ['old', 'green'], ...
split_generator = (item[1].split(';') for item in data)
# генерирует последовательность 'old', 'white', 'old', 'green', ...
property_generator = chain.from_iterable(split_generator)
# исправляет регистр и удаляет пробелы - можно убрать, если не надо
property_fixed_generator = (item.strip().lower() for item in property_generator)
# поглощает данные из генераторов и считает вхождения
count = Counter(property_fixed_generator)
print(count) # Counter({'old': 3, 'green': 2, 'white': 1, 'brown': 1, 'new': 1})