2016-07-29 7 views
0

Ich habe eine Funktion geschrieben, um jede benutzerdefinierte Zeit für Updates zu überprüfen und, falls vorhanden, eine Benachrichtigung darüber anzuzeigen. Mein Code:Aufruf von wxPython.NotificationMessage zu jeder angegebenen Zeit

def show_notification(): 
    notification_bubble = wx.App() 
    wx.adv.NotificationMessage("", "sample notification").Show() 
    notification_bubble.MainLoop() 

def update(): 
    # retrieve var from newest_porcys_url_imported 
    first_porcys_url = newest_porcys_url_imported() 

    # retrieve var from newest_pitchfork_url_imported 
    first_pitchfork_url = newest_pitchfork_url_imported() 

    # fetch newest review url with get_porcys_review_url 
    get_latest_porcys_url_ = get_porcys_review_url() 
    get_latest_porcys_url = get_latest_porcys_url_[0] 

    # fetch newest review url with get_pitchfork_review_url 
    get_latest_pitchfork_url_ = get_pitchfork_review_url() 
    get_latest_pitchfork_url = get_latest_pitchfork_url_[0] 

    a = first_porcys_url + ' ' + get_latest_porcys_url 
    b = first_pitchfork_url + ' ' + get_latest_pitchfork_url 

    get_datetime = datetime.now() 
    hour = str(get_datetime.hour) 
    minutes = str(get_datetime.minute) 

    f = open('log.txt', 'a') 
    f.write(hour + ':' + minutes + ' ' + a + ' ' + b + '\n') 
    f.close() 
    if first_porcys_url != get_latest_porcys_url or first_pitchfork_url != get_latest_pitchfork_url: 
     print('new reviews') 
     f = open('new reviews.txt', 'a') 
     f.write(hour + ':' + minutes + ' ' + a + ' ' + b + '\n') 
     f.close() 
     return True 
    else: 
     show_notification() 
     return False 

Mein Problem ist, dass es nur die Meldung einmal angezeigt und nach, dass es nicht alles tun, einschließlich der Ausführung Update Funktion. Ich ersetzte call_function() mit print Anweisung zum Testen und alles hat gut funktioniert, so dass Aufruf dieser Funktion Probleme verursacht.

Antwort

1

Das Problem ist Ihre show_notification() -Funktion. Die Zeile:

notification_bubble.MainLoop() 

wird nur beendet, wenn das Fenster geschlossen ist. Wenn Sie also Ihre show_notification() -Funktion aufgerufen haben, gehen Sie in eine Schleife und warten darauf, dass der Benutzer das Fenster schließt. Aber wenn er es tut, dann wird das Programm beendet. Daher ist es nicht möglich, show_notification() mehr als einmal aufzurufen.

wxPython Documentation on MainLoop()

Ich weiß nicht viel über wxPython, aber ich erwarte, dass Sie in Threading bekommen haben könnte.

Threading Tutorial

Sie würden einen neuen Thread für jede Meldung wie folgt beginnen:

import threading 

def show_notification(): 
    notification_bubble = wx.App() 
    wx.adv.NotificationMessage("", "sample notification").Show() 
    notification_bubble.MainLoop() 

def update(): 
    # retrieve var from newest_porcys_url_imported 
    first_porcys_url = newest_porcys_url_imported() 

    # retrieve var from newest_pitchfork_url_imported 
    first_pitchfork_url = newest_pitchfork_url_imported() 

    # fetch newest review url with get_porcys_review_url 
    get_latest_porcys_url_ = get_porcys_review_url() 
    get_latest_porcys_url = get_latest_porcys_url_[0] 

    # fetch newest review url with get_pitchfork_review_url 
    get_latest_pitchfork_url_ = get_pitchfork_review_url() 
    get_latest_pitchfork_url = get_latest_pitchfork_url_[0] 

    a = first_porcys_url + ' ' + get_latest_porcys_url 
    b = first_pitchfork_url + ' ' + get_latest_pitchfork_url 

    get_datetime = datetime.now() 
    hour = str(get_datetime.hour) 
    minutes = str(get_datetime.minute) 

    f = open('log.txt', 'a') 
    f.write(hour + ':' + minutes + ' ' + a + ' ' + b + '\n') 
    f.close() 
    if first_porcys_url != get_latest_porcys_url or first_pitchfork_url != get_latest_pitchfork_url: 
     print('new reviews') 
     f = open('new reviews.txt', 'a') 
     f.write(hour + ':' + minutes + ' ' + a + ' ' + b + '\n') 
     f.close() 
     return True 
    else: 
     notificationThread = threading.Thread(target=show_notification) 
     # Prepare the thread 
     notificationThread.daemon = True 
     # Make shure it will run in the background 
     notificationThread.start() 
     # Start the thread 

     return False 

Auf diese Weise jede Meldung ist ein Hintergrundprozess, während die Hauptprogramm auf Laufen zu halten.

Ich hoffe, ich könnte helfen. Einen schönen Tag noch!

1

Sie würden die ganze Sache in die mainloop wickeln:
Diese einfache Anwendung erstellt eine Sperrmeldung, wenn Sie eine nicht-blockierende oder selbst Cancelling Nachricht wollen, das ist eine ganz andere Kessel der Fische!

import wx 
import time 
def Alerts(x): 
    #Do your stuff here rather than sleeping 
    time.sleep(2) 
    dlg = wx.MessageBox("New Message "+str(x),"My message heading",wx.OK | wx.ICON_INFORMATION) 

if __name__ == "__main__": 
    A1 = wx.App() 
#This could be a while True loop 
    for x in range(10): 
     Alerts(x) 
    A1.MainLoop() 
Verwandte Themen