Отображение уведомления на рабочем столе после получения нового сообщения python tkinter

Я хотел создать систему уведомлений для Stackru с использованием tkinter, когда элемент не прочитан в моем почтовом ящике, я хочу, чтобы он отображал уведомление (но только один раз), что он и делает. Но это не эффективно. В некотором смысле он показывает уведомление один раз, и когда я нажимаю на него, требуется некоторое время, чтобы уведомление было идентифицировано как прочитанное API, поэтому новые уведомления продолжают появляться, вызывая сбой графического интерфейса (поскольку я запускаю его внутри а after()). Поэтому я хотел знать, можно ли каким-то образом сделать часть уведомлений более эффективной.

Код:

import tkinter as tk
import add
from time import ctime
import datetime
from stackapi import StackAPI
from win10toast import ToastNotifier
import threading
import webbrowser

root = tk.Tk()
root.title('Stack Notifier')

def authorise():
    print('auth')
    global end, acc_key, start, inbox, auth_button
    if required:
        add.run() #selenium for automation
        acc_key = add.acc_key_dum #accesskey passed from another module
        start = datetime.datetime.now()
        hours_added = datetime.timedelta(hours=24)
        end = start + hours_added #time for reaunthentication
        site.key = add.key #access key from another module
        site.access_token = acc_key #access token from another module
        site.max_pages = 1
        inbox = site.fetch('users/13382000/inbox')
        auth_button['state'] = tk.DISABLED
        threading.Thread(target=first).start()
    
    else:
        inbox = site.fetch('users/13382000/inbox')
        threading.Thread(target=first).start()

def first():
    global current, required, inbox, auth_button

    def popup():
        webbrowser.open(link,new=0)

    inbox = site.fetch('users/13382000/inbox')
    print('chc')
    current = datetime.datetime.now()
    if start < current < end:
        required = False
    
    else:
        required = True
        auth_button['state'] = tk.NORMAL 

    if not required:
        print('first')
        is_unread = inbox['items'][0]['is_unread']
        if is_unread:
            title = inbox['items'][0]['title']
            item_type = inbox['items'][0]['item_type']
            link = inbox['items'][0]['link']
            creation_date = ctime(inbox['items'][0]['creation_date'])
            noti = ToastNotifier()
            noti.show_toast(f'StackOveflow - {item_type}',f'{title} - {creation_date}',duration=5,callback_on_click=popup,threaded=True)
            print('yes')
   
    else:
        threading.Thread(target=authorise).start()
    
    root.after(1000,threading.Thread(target=first).start)

required = True #a reference to whether authentication is required again, after 24 hrs
label_login = tk.Label(root,text='Click To authorise with Stackru',font=('helvatica',16))
label_login.grid(row=0,columnspan=3)

auth_button = tk.Button(root,text='Authorise',command=authorise)
auth_button.grid(row=1,column=1)

site = StackAPI('stackru')

root.mainloop()

Я знаю, что это не лучший код, но я открыт для идей и предложений.

PS: Я использую селен для автоматизации и запрашиваю учетные данные пользователя. и для этого требуется разрешение каждые 24 часа, поэтому мне также нужно загружать селен каждые 24 часа, что, я думаю, делается отлично.

Заранее спасибо

0 ответов

Другие вопросы по тегам