2016-01-12 2 views
0

Je travaille sur ce code pour calculer certaines valeurs trouvées dans un fichier gcode. Il y a une valeur de volume trouvée dans le fichier gcode chargé, puis la masse et le prix sont trouvés. Je voulais que l'on puisse entrer ces variables en utilisant la fonction d'entrée, mais aussi qu'il y ait des valeurs par défaut en premier lieu. Mon problème est que la fenêtre d'entrée n'efface pas et n'accepte pas d'autres valeurs, seules les valeurs par défaut sont présentes. J'utilise entry.delete (0, END) mais ça ne marche pas.La fenêtre d'entrée dans tkinter ne supprime pas

Voici le code:

def delete_entry(self): 
     e.delete(0, END) 
     return None 

# def Statusbar(self): 
#   self.stat1.set("Waiting for the file... ") 

    #Creation of init_window 
    def init_window(self): 

     # changing the title of our master widget  
     self.master.title("Filament Data") 

     # allowing the widget to take the full space of the root window 
     self.pack(fill=BOTH, expand=1) 

     # creating a menu instance 
     menu = Menu(self.master) 
     self.master.config(menu=menu) 

     # create the file object) 
     file = Menu(menu) 
     help = Menu(menu) 

     # adds a command to the menu option, calling it exit, and the command it runs on event is client_exit 
     file.add_command(label="Exit", command=self.client_exit) 
     help.add_command(label="About", command=self.about_popup) 

     #added "file" to our menu 
     menu.add_cascade(label="File", menu=file) 
     menu.add_cascade(label="Help", menu=help) 


     #Creating the intro label 
     l_instruction = Label(self, justify=CENTER, compound=TOP, text="Enter density and price per \n gram of your material and then \n load GCODE file to find volume, \n weight and price of used filament.") 
     l_instruction.grid(columnspan=2, ipady=10) 


     #Creating the button 
     gcodeButton = Button(self, text="Load GCODE", command=self.read_gcode) 
     gcodeButton.grid(row=3, columnspan=2, ipady=10) 

     #Entry fields for density and price per gram 
     e = Entry(self, justify=CENTER, width=5) 
#  e.delete(0, END) 
     e.insert(0, "1.13") 
     e.grid(row=1, column=0) 
     e.bind("<Button-1>", self.delete_entry) 
     self.density = float(e.get()) 


     e_label = Label(self, text="D") 
     e_label.grid(row=2, column=0) 

     e1 = Entry(self, justify=CENTER, width=5) 
#  e1.delete(0, END) 
     e1.insert(0, "0.175") 
     e1.grid(row=1, column=1) 
     self.price = float(e1.get()) 

     e1_label = Label(self, text="$") 
     e1_label.grid(row=2, column=1) 
+2

Veuillez essayer de réduire ce code au plus petit programme possible illustrant le problème. Voir http://www.stackoverflow.com/help/mcve –

+1

Le seul endroit dans votre code où vous appelez la méthode 'delete' d'un widget d'entrée est quand vous créez d'abord le widget (et il est créé vide, donc cela n'a pas effet). –

+1

N'est-il pas créé rempli avec les valeurs d'exemple? C'est ainsi que je l'ai compris et donc j'ai placé supprimer juste après. Je pensais que cette suppression est déclenchée chaque fois que la souris est placée dans la zone de saisie. – Bart

Répondre

1

Lorsque vous appelez la méthode delete, il supprime immédiatement tout ce qui est dans le widget. Dans votre cas, vous l'appelez immédiatement après avoir créé le widget alors qu'il n'y a rien à supprimer.

Si vous souhaitez que le texte d'un widget d'entrée soit supprimé lorsqu'un utilisateur clique dessus, vous devez définir une liaison qui supprime le contenu.

Pour créer une liaison, appelez la méthode bind du widget et indiquez-lui l'événement à lier et la fonction à appeler. Par exemple, si vous voulez appeler la fonction delete_entry, vous pouvez le faire comme ceci:

def delete_entry(event): 
    event.widget.delete(0, "end") 

e = Entry(...) 
e.bind("<1>", delete_entry) 

Lorsque vous liez une fonction à un événement, la fonction sera appelée avec un argument - un objet qui représente la un événement. L'un des attributs de l'objet est widget, qui est une référence au widget qui possède l'événement. Vous pouvez utiliser cette référence pour interagir avec le widget.

+0

Mais il y a certaines valeurs dans la zone de saisie initialement comme nombres par défaut, donc quelqu'un ne peut pas choisir de les modifier. Et j'ai compris que cette option 'delete' ne fonctionne que lorsque vous entrez dans la zone de saisie - je veux dire essayer de changer la valeur. – Bart

+0

Je l'ai déjà fait (après votre réponse mise à jour) et cela n'a pas fonctionné. Il y a des erreurs lors de la compilation et quand je change d'événement en moi les erreurs disparaissent mais la fenêtre d'entrée n'est pas effacée. – Bart

+0

@Bart: sans voir votre code, il est impossible de le dire. Renommer 'event' en' self' ne changera rien (sauf forcer l'utilisation ultérieure de 'event' à échouer). Cependant, si vous utilisez des classes, 'self' est absolument nécessaire _ en plus de l'objet event_. Le code dans cette réponse fonctionnera absolument. Vous devriez recevoir un message d'erreur vous indiquant exactement quel est le problème. –