2013-07-10 17 views
5

Stworzyłem skrypt w Pythonie, które mnie w danym przypadku powiadamia. używam następującą funkcję do produkcji okno z ostrzeżeniem:Tkinter TkMessageBox nie zamykając po kliknięciu OK

def window_warn(): 
    ''' 
    This function will throw up a window with some text 
    ''' 
    #These two lines get rid of tk root window 
    root = Tkinter.Tk() 
    root.withdraw() 
    #tkMessageBox.deiconify() 
    TkMessageBox.showwarning("New Case", "You have a new case\n Please restart pycheck") 
    return 

Okno rysuje w porządku, ale po kliknięciu OK, okno pozostaje na swoim miejscu za pomocą przycisku depresji. Im przy użyciu xfce. Czy mimo to uzyskać, aby zamknąć okno po kliknięciu OK?

Komentarz wskazane może być to zrobić z otaczającym kodzie, tak pod względem kompletności:

print "Just started newcase check" 
while True: 
    if "Uncommitted" in webpage: 
     print "oh look, 'Uncommitted' is in the url returned from the last function" 
     #If this hits we call a notification window 
     window_warn() 
     print "sleeping" 
     time.sleep(10) 

     webpage = scrape_page() 
    else: 
     print "nothing" 
     time.sleep(20) 
     webpage = scrape_page() 
+0

Właśnie dodałem kod, który wywołuje funkcję dla kontekstu – Rqomey

+0

Ponadto, gdy uruchomię to w powłoce interaktywnej, działa dobrze. Nie wiem, czy to dlatego, że nie jestem przechwytywania zwrot 'ok' – Rqomey

Odpowiedz

6

Spróbuj zadzwonić root.update() przed powrotem z funkcji. Przetworzy to wszystkie oczekujące zdarzenia okna Tk/X.

(najlepiej, by ustanowić główną pętlę zdarzeń przed wyświetleniem okna, ale zakłada, że ​​cały program jest sterowany zdarzeniami, które może nie zawsze działa).

+0

Dzięki, To chyba dokładnie to! – Rqomey

+0

Niestety, byś połowy wyjaśniając, co masz na myśli przez główną pętlę zdarzeń? Program skanuje stronę internetową co minutę. – Rqomey

+0

Programy Tkinter zwykle (ale nie zawsze) składają się z Tk "na górze" i kodu uruchamianego przez callbacki - tzn. Najpierw ustawiasz partię Tk, wywołujesz mainloop, a następnie czekasz, aż Tk zadzwoni, zwykle w odpowiedzi do interakcji użytkownika z programem. To chyba trochę niepraktyczne dla twojej sprawy. – Fredrik

0

Trzeba zadzwonić root.mainloop() włączyć program do reagowania na zdarzenia.

+0

Więc zadzwoniłem' root.mainloop() '' tkmb.showwarning po prawo („nowy przypadek”, „Masz nową sprawę”) 'i wydaje po prostu powiesić, nic nie robi. Czy należy go wywoływać w określony sposób? Dzięki – Rqomey

+0

To musi być uruchomiony _before_ otworzyć okno, ponieważ otwarcie bloków dialogowych aż dialogowe zostaje oddalona. –

0

Jeden problem na kodzie jest, aby utworzyć nowy element Tk przy każdym wywołaniu funkcji window_warn. To nie może być przyczyną twojego problemu, ale tworzenie wielu elementów Tk jest złym zwyczajem, którego należy unikać. Na przykład zainicjować element główny na początku i pozostawić tylko powołanie do showwarning:

root = Tkinter.Tk() 
root.withdraw() 

def window_warn(): 
    '''This function will throw up a window with some text''' 
    tkMessageBox.showwarning("New Case", "You have a new case\n Please restart pycheck") 
    return 

print "Just started newcase check" 
while True: 
    # ... 
+0

Widzę tutaj twój punkt widzenia. Jeśli zadzwonię do root'a spoza tej funkcji, nie będę mógł uruchomić funkcji root.update() na tej funkcji. Być może mam go skonfigurowany w niewłaściwy sposób i powinienem mieć sekcję pierwszego uruchomienia, aby początkowo uruchomić root = Tkinter.Tk(), tak czy inaczej działa teraz w terminalu, więc wygląda na to, że działa dobrze w tej chwili (brak powielania okien) – Rqomey

+0

Kod w funkcji może nadal mieć dostęp do katalogu głównego, jeśli jest zdefiniowany w tym samym module (w języku Python nazywana jest "globalną" zmienną, mimo że jest bezpośrednio widoczna tylko dla kodu wewnątrz tego samego modułu). Nie widzę jednak żadnej dużej szkody w odtwarzaniu okna głównego Tk. – Fredrik

0

Zrobiłem to tis sposób:

import Tkinter as tk 
import tkMessageBox 
root = tk.Tk() 
root.withdraw() 
t = tkMessageBox.askyesno ('Title','Are you sure?') 
if t: 
    print("Great!!!") 
    root.update() 
else: 
    print("Why?") 
    root.update() 
Powiązane problemy