2017-09-13 1 views
0

Je crée une interface graphique à écran tactile avec des widgets à entrées multiples qui sont édités à l'aide d'un clavier. Comment puis-je savoir quel widget d'entrée l'utilisateur a sélectionné? J'ai créé un chemin détourné où chaque entrée est codée comme un bouton et quand on clique dessus, le bouton édite une variable «sélectionnée» que le clavier utilise ensuite pour savoir lequel modifier mais y a-t-il un meilleur moyen? Peut-être utiliser la mise au point? (Je les widgets bouton de travail mais je veux utiliser le widget d'entrée commenté, également un code non pertinent a été supprimé de sorte que le poste n'a pas été trop long)Comment sélectionner des widgets d'entrée spécifiques pour les appels de fonction dans tkinter à l'aide d'un écran tactile?

class MyApp(Tk): 
    def __init__(self,*args, **kwargs): 
     Tk.__init__(self, *args, **kwargs) 

     container = Frame(self) 
     container.pack(side="top", fill="both", expand = True) 

     self.shared_data = { 
      'codeOne' : StringVar(), 
      'codeTwo' : StringVar(), 
      'selectedCode' : StringVar(), 
     } 

    def setCode(self, value): 
     #function updates selected variable 
     selectedVar = self.shared_data['selectedCode'] 
     if selectedVar.get() == 'codeOne': 
      code = self.shared_data['codeOne'] 
     elif selectedVar.get() == 'codeTwo': 
      code = self.shared_data['codeTwo'] 
     else: #non selected 
      print('nothing selected') 
      return False 
     old = code.get() 
     if type(value) == int: 
      code.set(old+str(value)) 
     else: 
      code.set(old[0:len(old)-1]) 
     return True 

    def setVariable(self, variable, value): 
     variable.set(value) 
     return True 

class MenuPage(Frame): 
    def __init__(self, parent, controller): 
     Frame.__init__(self, parent) 
     self.controller = controller 

     Label(self, text="Code 1:", font='Helvetica 15').grid(row=2, column=0, columnspan=3, sticky=E, pady=10) 
     Button(self, textvariable=controller.shared_data['codeOne'], font=MENU_ENTRIES, width=7, bg='grey99', command=lambda:controller.setVariable(controller.shared_data['selectedCode'],'codeOne')).grid(row=2, column=1, pady=10) 
     #Entry(self, textvariable=controller.shared_data['codeOne'], font='Helvetica 15').grid(row=2, column=3, columnspan=1, pady=10, sticky=W) 

     Label(self, text="Code 2:", font='Helvetica 15').grid(row=3, column=0, columnspan=3, sticky=E, pady=10) 
     Button(self, textvariable=controller.shared_data['codeTwo'], font=MENU_ENTRIES, width=7, bg='grey99', command=lambda:controller.setVariable(controller.shared_data['selectedCode'],'codeTwo')).grid(row=2, column=1, pady=10) 
     #Entry(self, textvariable=controller.shared_data['codeTwo'], font='Helvetica 15').grid(row=3, column=3, columnspan=3, pady=10, sticky=W) 

     Button(self, text="1", width=3, command=lambda:controller.setCode(1)).grid(row=1, column=3, rowspan=2, padx=(20,5), pady=10) 
     Button(self, text="2", width=3, command=lambda:controller.setCode(2)).grid(row=1, column=4, rowspan=2, padx=5, pady=10) 
     Button(self, text="3", width=3, command=lambda:controller.setCode(3)).grid(row=1, column=5, rowspan=2, padx=5, pady=10) 
     Button(self, text="4", width=3, command=lambda:controller.setCode(4)).grid(row=3, column=3, rowspan=2, padx=(20,5), pady=10) 
     Button(self, text="5", width=3, command=lambda:controller.setCode(5)).grid(row=3, column=4, rowspan=2, padx=5, pady=10) 
     Button(self, text="6", width=3, command=lambda:controller.setCode(6)).grid(row=3, column=5, rowspan=2, padx=5, pady=10) 
     Button(self, text="7", width=3, command=lambda:controller.setCode(7)).grid(row=5, column=3, rowspan=2, padx=(20,5), pady=10) 
     Button(self, text="8", width=3, command=lambda:controller.setCode(8)).grid(row=5, column=4, rowspan=2, padx=5, pady=10) 
     Button(self, text="9", width=3, command=lambda:controller.setCode(9)).grid(row=5, column=5, rowspan=2, padx=5, pady=10) 
     Button(self, text="DELETE", width=7, command=lambda:controller.setCode('delete')).grid(row=7, column=3, rowspan=2, columnspan=2, padx=(20,5), pady=10) 
     Button(self, text="0", width=3, command=lambda:controller.setCode(0)).grid(row=7, column=5, rowspan=2, padx=5, pady=10) 

app = MyApp() 
app.mainloop() 

Répondre

0

J'imagine que cela fonctionnerait exactement la même chose est si vous aviez une souris et un clavier traditionnels. Lorsque l'utilisateur touche un widget d'entrée, ce widget obtient le focus. Votre fonction doit simplement entrer du texte dans le widget avec le focus. C'est exactement le genre de problème que le concept de "focus" existe.

Supprimer vos boutons, mettez votre entrée un widget arrière et changer setCode être ceci:

def setCode(self, value): 
    # get the widget with the focus 
    widget = self.focus_get() 

    # insert the value 
    widget.insert("insert", value) 

Vous pouvez également donner le premier foyer widget d'entrée. Pour ce faire, vous devez garder une référence à (il est recommandé de séparer la création du widget de l'ajouter à la fenêtre avec grid, pack ou place même si vous n'avez pas besoin d'une référence):

entry = Entry(self, textvariable=controller.shared_data['codeOne'], width=7, bg='grey99') 
entry.grid(row=2, column=1, pady=10) 
entry.focus_set() 
+0

Merci! Je vais devoir modifier la fonction d'insertion pour quand la touche d'effacement est pressée mais à part cela, cela fonctionne! –