2017-10-29 7 views
0

Ich versuche, eine Funktion zu erstellen, die ein tkinter-Fenster öffnet, so dass der Benutzer die Position von 2 Punkten eingeben kann. Ähnlich wie bei Matlabs Eingabe-ID Funktion.Eingabedialogfeld auf Python mit tkinter

Die "GUI" hat eine Schaltfläche, die beim Klicken die "Eingabebox" schließt und die Punkte erhält.

Bis jetzt konnte ich das Fenster erstellen, aber ich kann die Punkte nicht abrufen. Wenn ich anstelle zurückgeben wähle ich Drucken die Werte, das wird ausgeführt.

Kann mir jemand sagen, was mit dem Code falsch ist?

import tkinter as tk 

root=tk.Tk() # this will create the window 

def get_value(event): 

    fpoint=int(entry1.get()) # Gets point 1 
    lpoint=int(entry2.get()) # Gets point 2 
    points=[fpoint,lpoint] 
    root.destroy()   # destroys Gui 
    return(points)   # Gets the points 

box1=tk.Label(root, text="First point") # Label of box 1 
entry1=tk.Entry(root)     # Box 1 

box2=tk.Label(root, text="Last point") # Label of box 2 
entry2=tk.Entry(root)     # box 2 

Done_button=tk.Button(root, name="done") #Button to terminate the "gui" 
Done_button.bind("<Button-1>",get_value) # Run function "get_value" on click  
box1.grid(row=1, sticky="W",padx=4)    # position of label for box1 
entry1.grid(row=1,column=1,sticky="E", pady=4) # position of box 1 
box2.grid(row=2, sticky="W",padx=4)    # position of label for box2 
entry2.grid(row=2,column=1,sticky="E", pady=4) # position of box2 
Done_button.grid(row=3,column=1)    # position of "button 

root.mainloop() 
+1

Event-Handler können nicht zurückkehren. Wohin sollen sie zurückkehren? Stattdessen müssen Sie den Status ändern. Am besten nicht global. Sie verwenden auch unnötigerweise bind, wo Sie einfach das Befehlsargument für die Schaltfläche verwenden könnten. – deets

Antwort

0

Wie deets im Kommentar erwähnt, müssen Sie stattdessen einen Elternteil oder ein globaler Variablenwert in der Funktion ändern.

Auch die Verwendung von Event-Handler ist unnötig und auch restriktiv in Done_button.bind("<Button-1>",get_value), da es die Funktion nur funktioniert, wenn Sie mit der linken Maustaste klicken. Das heißt, wenn zum Beispiel der Knopf den Fokus hat, wird das Drücken der Leertaste nichts tun, obwohl das eine gültige Taste ist. Stattdessen könnten Sie command Option von tk.Button für den Aufruf einer Funktion jedes Mal verwenden, wenn die Taste gedrückt wird.

Ich habe den Code bearbeitet und hinzugefügt, um die Zeilen:

####### MODIFY A VARIABLE IN PARENT ####### 
    root.geometry(entry1.get() + "x" + entry2.get()) 

für einen Wert von Eltern zu modifizieren, und:

####### Configuring the button to call a function when pressed ####### 
Done_button.configure(command=get_value) 

Unten ist der gesamte Code mit den vorgeschlagenen Änderungen :

import tkinter as tk 

root=tk.Tk() # this will create the window 

def get_value(): 

    fpoint=int(entry1.get()) # Gets point 1 
    lpoint=int(entry2.get()) # Gets point 2 
    points=[fpoint,lpoint] 

    ####### MODIFY A VARIABLE IN PARENT ####### 
    root.geometry(entry1.get() + "x" + entry2.get()) 

box1=tk.Label(root, text="First point") # Label of box 1 
entry1=tk.Entry(root)     # Box 1 

box2=tk.Label(root, text="Last point") # Label of box 2 
entry2=tk.Entry(root)     # box 2 

Done_button=tk.Button(root, name="done") #Button to terminate the "gui" 

####### Configuring the button to call a function when pressed ####### 
Done_button.configure(command=get_value) 
#Done_button.bind("<Button-1>",get_value) # Run function "get_value" on click 
box1.grid(row=1, sticky="W",padx=4)    # position of label for box1 
entry1.grid(row=1,column=1,sticky="E", pady=4) # position of box 1 
box2.grid(row=2, sticky="W",padx=4)    # position of label for box2 
entry2.grid(row=2,column=1,sticky="E", pady=4) # position of box2 
Done_button.grid(row=3,column=1)    # position of "button 



root.mainloop()