2017-12-05 6 views
0

image for that Ich habe paar Zeilen Code hier schließt Meldungsfeld Pflicht, das System, das funktioniert gut anmelden, aber ich kann auf dem Toplevel mehrmals klicken, wenn ich das falsche Kennwort eingeben, das messagebox .Wie ohne Schließen kann ich es so machen, dass es geschlossen werden muss messagebox bevor ich es erneut versuchen kann.Wie für Toplevel Fenster

from tkinter import * 
from tkinter import messagebox 


def top(): 
    if entry1.get() == "333": 
     log.destroy() 
     root.deiconify() 
    else: 
     messagebox.showerror("error", "try again") 


root = Tk() 
root.geometry("300x300") 

log = Toplevel(root) 
log.geometry("200x200") 


label1 = Label(log, text="password") 
entry1 = Entry(log) 
button1 = Button(log, text="login", command=top) 

label1.pack() 
entry1.pack() 
button1.pack(side="bottom") 

lab = Label(root, text="welcome bro").pack() 


root.withdraw() 
root.mainloop() 
+0

Mögliches Duplikat [wie ein modalen Dialog in tkinter erstellen?] (https://stackoverflow.com/questions/16803686/how-to-erstellen-a-modal-dialog-in-tkinter) – SiHa

+0

Ich habe versucht, grab_set() und wait_window() hat es nicht funktioniert. –

+0

'grab_set()' sollte funktionieren, wenn Sie ein eigenes Meldungsfeld mit 'Toplevel()' erstellen - siehe [Dialog Windows] (http://effbot.org/tkinterbook/tkinter-dialog-windows.htm) – furas

Antwort

0

Mit Hinweis von @furas dies, wie dies umzusetzen:

erstellen eine andere Funktion die es nennen, wenn der Eintrag nicht und Methode tp.grab_set() für die Toplevel-Fenster verwenden grab_set überein .Sie Ihr customarised Bild hinzufügen können, um die Toplevel-Fenster sowie Nachricht in der Box angezeigt werden (hier: i-Label verwenden, das zeigen)

from tkinter import * 
from tkinter import messagebox 



def dialog(): # this function to call when entry doesn't match 
    tp = Toplevel(log) 
    tp.geometry("300x100") 
    tp.title('error') 
    tp.grab_set() # to bring the focus to the window for you to close it 
    tp.resizable(width=False, height=False) 
    l = Label(tp, text="try again\n\n\n\n add your customarize image to the window") 
    l.pack() 


def top(): 
    if entry1.get() == "333": 
    log.destroy() 
    root.deiconify() 
else: 
    dialog() # being called here 


root = Tk() 
root.geometry("300x300") 

log = Toplevel(root) 
log.geometry("200x200") 


label1 = Label(log, text="password") 
entry1 = Entry(log) 
button1 = Button(log, text="login", command=top) 

label1.pack() 
entry1.pack() 
button1.pack(side="bottom") 

lab = Label(root, text="welcome bro").pack() 


root.withdraw() 

root.mainloop() 
+0

die Toplevel wird nicht blinken und haben die Glocke() Effekt, wenn Sie mehrere versuchen, auf die Schaltfläche klicken. –

1

Sie müssen die Log-Fenster der Eltern des Dialogs machen:

messagebox.showerror("error", "try again", parent=log) 

Standardmäßig wird die Root-Fenster verwenden (die Tk Instanz) als Mutter in diesem Fall das ist nicht das, was Sie wollen.

+0

Es macht das Fenster zum Einfrieren, wenn ich wieder auf das Hauptfenster klicke, bis ich es wieder mit Task-Manager schließe, bevor ich es wieder ausführen kann –

+1

Meine Antwort ist für den Code gedacht, wo Sie nicht auf das Stammfenster klicken können, weil es zurückgezogen wird. – Goyo

+0

Diese Antwort funktioniert möglicherweise OS-Faktor bin mit Windows 7 –

Verwandte Themen