2017-07-02 9 views
0

Mein Tkinter-Fenster wird die meiste Zeit korrekt angezeigt, aber manchmal wird es nicht angezeigt. Es ist ein großer Schmerz. Ich habe verschiedene Dinge ausprobiert (zB das Auslassen eines beliebigen Pygame-Renderings während der Tkinter-Fensterkonstruktion) und ich habe bestätigt, dass die Fensterkoordinaten genau gleich sind, wenn sie angezeigt werden oder nicht angezeigt werden. Ich habe versucht, lift das Fenster, ich habe versucht, force_focus auf dem Fenster, aber nichts funktioniert.Warum wird mein Tkinter-Fenster manchmal überhaupt nicht angezeigt?

Hier ist mein Code:

# Function to take a postcode and station using Tkinter: 
def first_time_setup(): 
    global test_w, test_r, default_colour 

    master = Tk() 
    master.withdraw() 

    master.overrideredirect(1) 
    back_img = PhotoImage(file=find_data_file('Outlooker_background.png')) 
    back_label = Label(master, image=back_img) 
    back_label.place(x=0, y=0, relwidth=1, relheight=1) 
    back_label.image = back_img 

    text_font = font.Font(family='Arial', size=12) 
    button_font = font.Font(family='Calibri Light', size=11, weight="bold") 

    master.columnconfigure(0, weight=3) 
    e_weather = Entry(master, font=text_font, width=15) 
    e_weather.grid(row=0, column=1, padx=5, pady=(15, 5), sticky=E) 
    b_weather = Button(master, text="TEST", font=button_font, 
         bg='light blue', command=lambda: test_weather(e_weather.get(), b_weather, b_done)) 
    b_weather.grid(row=0, column=2, padx=(0, 15), pady=(12, 0), sticky=E) 

    e_rail = Entry(master, font=text_font, width=15) 
    e_rail.grid(row=1, column=1, padx=5, pady=5, sticky=E) 
    b_rail = Button(master, text="TEST", font=button_font, 
        bg='light blue', command=lambda: test_rail(e_rail.get(), b_rail, b_done)) 
    b_rail.grid(row=1, column=2, padx=(0, 15), sticky=E) 

    b_done = Button(master, text="DONE", font=button_font, state=DISABLED, 
        bg='light blue', command=lambda: testing_done(master)) 
    b_done.grid(row=2, column=2, padx=(0, 15), pady=10, sticky=E) 

    if first_time: 
     b_quit = Button(master, text="QUIT", font=button_font, 
         bg='light blue', command=lambda: sys.exit(0)) 
    else: 
     b_quit = Button(master, text="EXIT", font=button_font, 
         bg='light blue', command=lambda: master.destroy()) 
     pygame.draw.rect(screen, black, (223, 296, 417, 134)) 
     pygame.display.flip() 

    b_quit.grid(row=2, padx=15, pady=10, sticky=W) 
    default_colour = b_quit.cget("background") 

    master.update_idletasks() # Update "requested size" from geometry manager 
    x = (master.winfo_screenwidth() - 417)/2 
    y = (master.winfo_screenheight() - 134)/2 
    master.geometry("417x134+%d+%d" % (x, y)) 
    master.deiconify() 
    master.lift() 
    master.focus_force() 
    e_weather.focus_set() 
    master.mainloop() 

Da das Fenster etwa die Hälfte der Zeit anzeigt, halte ich meinen Code in Ordnung zu sein, und dies ist möglicherweise ein Fehler entweder mit Tkinter oder sogar Windows? Weiß jemand, was passiert, bitte?

EDIT: Hier ist der Aufruf first_time_setup:

if first_time: 
    first_time_setup() 

first_time = False 

So alle weiteren Anrufe werden die else Anweisung innerhalb der Funktion auslösen.

+0

Wie nennt man 'first_time_setup'? – SneakyTurtle

+0

@SneakyTurtle: Ich habe die Frage bearbeitet, um den Anruf anzuzeigen. – JasonPy

Antwort

1

Viele Leute haben diese Art von Frage in letzter Zeit gefragt, wo overrideredirect beteiligt ist. Hier ist also eine etwas längere Antwort darauf, warum es passiert und (in diesem Fall), wie Sie es möglicherweise beheben können. Sobald Sie die Zeile master.overrideredirect(1) ausführen, senden Fenstermanager keinen Fokus oder andere Ereignismeldungen an das Fenster. Was Ihr Problem lösen könnte, ist am Ende Ihrer Initialisierung master.overrideredirect(1) zu tun. Beachten Sie außerdem, dass der Fenstermanager nach dem Ausführen des Befehls das Fenster im Wesentlichen ignoriert. Versuchen Sie dieses Experiment mit master.overrideredirect(1) und master.overrideredirect(0) separat. Sobald das Fenster gerendert ist, wechseln Sie mit den Tasten <Alt-Tab> durch die Fenster. Beachten Sie, dass bei master.overrideredirect(1) das Fenster nicht in der Fensterliste angezeigt wird, um durchzulaufen. Schließlich, wenn der Benutzer <Alt-Tab> weg von dem Fenster, gibt es kein Ereignis an die Anwendung gesendet, um dies zu erkennen, und die Benutzer möglicherweise eine sehr schwierige Zeit Fokus zurück auf das Fenster, abhängig davon, wie viele überlappende Fenster sie haben es abdecken.

Normalerweise ist es unklug, ein grenzenloses Hauptfenster zu haben, weil der Benutzer es nicht kontrolliert. Der Grund overrideredirect existiert wahrscheinlich, um die Erstellung von benutzerdefinierten temporäre Dienstprogramm und Megawidgets wie Comboboxen und dergleichen zu ermöglichen.

+0

Vielen Dank! Der 'master.overridredirect (1)' war ein Teil eines Codeausschnitts, den ich gefunden habe, um das tkinter-Fenster zu zentrieren, indem ich die Bildschirmabmessungen erhielt - ich nahm an, dass es notwendig war, den Fenstermanager zu deaktivieren, aber zugegebenermaßen nicht es hat viel gedacht. Schülerfehler. Ich habe es vollständig entfernt (mein Fenster ist nicht randlos) und ich habe es 4 oder 5 Mal hintereinander ausgeführt und scheint den Trick gemacht zu haben, und das Fenster ist immer noch zentriert auf dem Bildschirm. Du hast meine Frage sowohl schnell als auch schlüssig beantwortet, also nochmals danke Ron. – JasonPy

Verwandte Themen