Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from tkinter import *
- from tkinter import messagebox
- import asyncio
- import threading
- import requests
- import logging
- # логирование
- FORMAT = '[%(levelname)s] %(message)s'
- file_handler = logging.FileHandler('ip.log', 'w', encoding='utf-8')
- file_handler.setFormatter(logging.Formatter(FORMAT))
- # уровень логинга INFO
- logging.basicConfig(level=logging.INFO, format=FORMAT)
- logging.getLogger().addHandler(file_handler)
- logging.getLogger("asyncio").setLevel(logging.INFO)
- # флаг остановки
- stop_flag = False
- # глобальные переменные для ip-адреса
- ip = None
- new_ip = None
- # добавление заданий в event loop
- def _asyncio_thread(async_loop):
- async_loop.run_until_complete(task_loop())
- # функция, которая стартует асинхронные потоки по нажатию кнопки
- def do_tasks(async_loop):
- threading.Thread(target=_asyncio_thread, args=(async_loop,)).start()
- # получение ip в бесконечном цикле асинхронно
- async def get_ip():
- global stop_flag
- global ip
- global new_ip
- logging.info('Получаем IP-адрес')
- while True:
- response = requests.get('https://ramziv.com/ip')
- ip = new_ip
- new_ip = response.text
- # если ip = None - ничего не пишем
- if ip is not None:
- logging.info(ip)
- # при изменение ip пишем в консоль (и в файл ip.log) сообщение
- if ip is not None and ip != new_ip:
- logging.info('IP-адрес был изменен')
- # остановка цикла (нужно только последнюю итерацию подождать)
- if stop_flag:
- break
- # проверка ip каждые 10 секунд
- await asyncio.sleep(10)
- # задания (функции, которые будут выполняться)
- async def task_loop():
- task1 = get_ip()
- # при добавлении check2() в список заданий
- # при изменении IP-адреса будет выводится messagebox с ошибкой
- # если не добавлять, то только текст в консоль (ip изменился)
- task2 = check2()
- tasks = [task1, task2]
- completed, pending = await asyncio.wait(tasks)
- # проверка на изменение ip по кнопке
- def check():
- global ip
- global new_ip
- # messagebox
- if ip is not None and ip != new_ip:
- messagebox.showinfo(message='IP был изменен')
- else:
- messagebox.showinfo(message='IP не изменился')
- # проверка на изменение автоматически
- async def check2():
- global ip
- global new_ip
- global stop_flag
- while True:
- # messagebox
- if ip is not None and ip != new_ip:
- messagebox.showerror(message='IP был изменен, ошибка')
- # остановка цикла (нужно только последнюю итерацию подождать)
- if stop_flag:
- break
- # проверка ip каждые 10 секунд
- await asyncio.sleep(10)
- # остановка получения ip в цикле
- # перед выходом из программы лучше нажать на нее
- # после чего потоки сделают еще 1 итерацию и завершатся
- def stop():
- global stop_flag
- print('stop')
- stop_flag = True
- # основной поток программы
- def main(async_loop):
- root = Tk()
- # привязка старта асинхронных потоков к кнопке
- Button(master=root, text='IP в цикле', command= lambda:do_tasks(async_loop)).pack()
- # кнопки с синхронными функциями
- buttonX = Button(master=root, text='Проверить IP', command=check).pack()
- buttonY = Button(master=root, text='Stop', command=stop).pack()
- root.mainloop()
- if __name__ == '__main__':
- # создание event loop
- async_loop = asyncio.get_event_loop()
- # добавление в него основного потока
- main(async_loop)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement