2016-03-08 3 views
0

J'ai ce problème avec Python Tkinter. J'essaye de faire un écran de forme d'interface d'utilisateur qui exige que l'utilisateur écrive des valeurs dans la boîte d'entrée montrée sur l'écran. Je l'ai mis ainsi les deux Entry Box sont dans la même classe (cette classe étant l'écran d'interface). Le problème est que pendant que je tape dans l'une des boîtes, le texte que je tape non seulement s'affiche dans la boîte dans laquelle je tape, mais aussi dans l'autre boîte.Lors de l'utilisation de python Tkinter, comment puis-je arrêter deux zones de saisie dans la même classe affichant le même texte d'entrée?

Voici le code en question.

class GenericSkeleton: # The template for all the screens in the program 

    def __init__(self): 

     self.GenericGui = Tk() 
     self.GenericGui.title('Radial Arc Calculator') 
     self.GenericGui.geometry('360x540') 
     self.GenericGui.resizable(width = FALSE, height = FALSE) 
     Label(self.GenericGui,text = 'Radial Arc Calculator',font = ('Ariel',18)).place(x=65,y=35) 

    def destroy(self): 

     self.GenericGui.destroy() 



class InputScreen(GenericSkeleton): 

    def __init__(self): 

     GenericSkeleton.__init__(self) 

     Button(self.GenericGui,text = 'CALCULATE',height = 1, width = 25, command = calculate, font = ('TkDefaultFont',14)).place(x=37,y=400) 
     Button(self.GenericGui,text = 'CLOSE',height = 1, width = 11, command = close, font = ('TkDefaultFont',14)).place(x=37, y=450) 
     Button(self.GenericGui,text = 'HELP', height = 1, width = 11, command = DisplayHelp, font = ('TkDefaultFont',14)).place(x=190, y=450) 

     Label(self.GenericGui,text = 'Enter Radius (mm):', font = ('TkDefaultFont',14)).place(x=37, y=180) 
     Label(self.GenericGui,text = 'Enter point distance (mm):', font = ('TkDefaultFont',14)).place(x=37, y=250) 

     Entry(self.GenericGui,textvariable = Radius, width = 10, font = ('TkDefaultFont',14)).place(x=210, y=180) 
     Entry(self.GenericGui,textvariable = Distance, width = 5, font = ('TkDefaultFont',14)).place(x=265, y=250)  

run = InputScreen() 

Le sont chez boîte d'entrée bas du code, je l'espère son assez/pas trop pour résoudre le problème.

+1

Où sont définis 'Radius' et' Distance'? Avez-vous quelque chose comme 'Radius = Distance = StringVar()' dans votre code? – Jkdc

+0

@Jkdc J'ai 'Radius = int (0)' et 'Distance = int (0)' en haut de mon code comme initialisation. Les données sont de type entier, puis-je utiliser 'Radius = Distance = IntVar()'? Et où dois-je le placer, à l'intérieur ou à l'extérieur de la classe? – Josh23761

Répondre

0

Le problème est qu'ils partagent tous deux le même textvariable (vous utilisez des noms de variables différents, mais ils ont la même valeur qui les rend identiques aux yeux de tkinter). Mon conseil est de ne pas utiliser l'attribut textvariable. Vous n'en avez pas besoin. Cependant, si vous supprimez l'utilisation de textvariable, vous devez séparer la création de votre widget de la disposition des widgets afin de conserver une référence au widget. Ensuite, vous pouvez utiliser la méthode get sur le widget (plutôt que sur la variable) pour obtenir la valeur:

self.entry1 = Entry(...) 
self.entry2 = Entry(...) 
self.entry1.place(...) 
self.entry2.place(...) 

Plus tard, vous pouvez obtenir les valeurs comme ceci:

radius = int(self.entry1.get()) 
distance = int(self.entry2.get()) 

Si vous avez besoin le textvariable (généralement uniquement si vous utilisez la fonctionnalité trace d'une variable tkinter), vous devez utiliser une variable tkinter (StringVar, IntVar, etc.) plutôt qu'une variable régulière.

+0

Merci, cela a corrigé le problème, mais je suis très nouveau à Tkinter, comment pourrais-je avoir la valeur tapée dans chaque boîte affectée à une variable que je peux ensuite utiliser pour les calculs/algorithmes? Pourrais-je simplement faire 'Radius = Entrée (self.GenericGui, width = 10, font = ('TkDefaultFont', 14)) .place (x = 210, y = 180) Distance = Entrée (self.GenericGui, largeur = 5, font = ('TkDefaultFont', 14)). Place (x = 265, y = 250) 'etc? – Josh23761

+0

Voir l'exemple de rappel d'effbot sur http://effbot.org/tkinterbook/entry.htm –

+0

@ Josh23761: si vous utilisez 'textvariable', vous devez utiliser' the_variable.get() 'pour obtenir la valeur. Si vous n'utilisez pas 'textvariable', vous devez utiliser' the_widget.get() '. De toute façon nécessite un appel de fonction. Au moins sans 'textvariable' vous avez un objet de moins que vous devez gérer. –