2017-05-14 5 views
0

Je veux faire une matrice d'entrées 3x3 et les entrées que je veux qu'elles interagissent les unes avec les autres. Je veux chaque fois que je présente une valeur flottante, puis appuyez sur la touche Entrée à l'intérieur d'une entrée (juste dans la première et la deuxième colonne) Je veux que la troisième colonne affiche la somme des première et deuxième colonnes de la rangée cela a été modifié.Obtenir un index d'une matrice remplie d'entrées

Comme ceci:

| 0.0| 2.5| 2.5| 
| 2.4| 1.5| 3.9| 
| 1.1| 2.2| 3.3| 

Voici mon code:

from Tkinter import * 

global i,j,m 

def compute(master): 
    suma=0.0 
    for x in range (0,1): 
     suma+=float(m[i][x].get()) 
    if not i==0: 
     suma+=float(m[i-1][2].get()) 
    print suma 
    m[i][2].insert(str(suma)) 


root = Tk() 

alto =3 
ancho=3 


m = [[0 for x in range(alto)] for y in range(ancho)] 



for i in range (0, alto): 
    for j in range (0, ancho): 
     m[i][j]= Entry(root) 
     m[i][j].grid(row = i,column = j) 
     m[i][j].insert(0,"0.0") 
     if (j==0 or j==1): 
      m[i][j].bind('<Return>', compute) 
     else: 
      m[i][j].config(state='readonly') 

root.mainloop() 

Comment puis-je obtenir l'indice d'une modification de l'entrée quand j'appuyez sur la touche Entrée? Je sais que cela pourrait être la comparaison d'une matrice variable et les valeurs actuelles de toutes les entrées, mais cela pourrait utiliser beaucoup de ressources, car à côté de cela, je vais utiliser une base de données avec beaucoup de valeurs.

+0

'suma = 0,0' devrait être' suma = 0.0' ... – jasonharper

+0

Puisque vous semblez calculer la valeur de toutes les colonnes, y a-t-il une raison pour laquelle vous avez besoin de l'index de l'entrée? La fonction liée recevra un objet qui a une référence au widget réel qui a été modifié. –

+0

La référence est "maître" dans la fonction de comparaison? Comment savoir quel widget a été modifié avec "master"? –

Répondre

0

Il me semble que vous avez quelque chose à apprendre sur la façon de déboguer votre code, car il y a beaucoup de petites erreurs. Voici votre code, avec des commentaires sur plusieurs choses que vous avez fait mal qui auraient pu être trouvées avec un simple débogage. S'il vous plaît passer du temps à essayer de comprendre ce genre de choses avant de poster ici.

from Tkinter import * 

global i, j, m 

# "You should rename master because that is a very misleading name. The 
# canonical name is event, though some prefer evt." – Bryan Oakley 
def compute(master): 
    suma = 0.0 
    # This for loop will only iterate once. You need range(0, 2): for it to go 
    # through the code twice 
    for x in range(0, 1): 
     suma += float(m[i][x].get()) 

    # I can't figure out the purpoes of this 
    if not i == 0: 
     suma += float(m[i - 1][2].get()) 
    print suma 

    # You've done it properly in the for loop, but not here. insert() needs an 
    # index as its first parameter 
    m[i][2].insert(str(suma)) 


root = Tk() 

alto = 3 
ancho = 3 
m = [[0 for x in range(alto)] for y in range(ancho)] 

# Because i is a global, and the below for loop, i is only ever going to 
# be equal to 2, which means your compute code is only going to compute 
# the 3rd row. 
for i in range(0, alto): 
    for j in range(0, ancho): 
     m[i][j] = Entry(root) 
     m[i][j].grid(row=i, column=j) 
     m[i][j].insert(0, "0.0") 
     if (j == 0 or j == 1): 
      m[i][j].bind('<Return>', compute) 
     else: 
      m[i][j].config(state='readonly') 

root.mainloop() 

Voici une version corrigée de votre fonction de calcul. S'il vous plaît, prenez le temps de passer en revue et de comprendre les changements que j'ai faits.

def compute(master): 
    # Loop through each row in the grid 
    for i in range(0, alto): 
     suma = 0.0 
     for x in range(0, 2): 
      # I've left in the prints I've used to debug as exmaples for you 
      print "i", i 
      print "get", m[i][x].get() 
      suma += float(m[i][x].get()) 
     print "suma", suma, "\n" 
     # You cannot insert into a readonly entry, so set it to normal first 
     m[i][2].config(state='normal') 
     # Inserting every time will add the string to the beginning of the 
     # entry, so that it builds up on every run. Instead delte the conetents 
     # of the entry first, and then insert. 
     m[i][2].delete(0, END) 
     m[i][2].insert(0, str(suma)) 
     # Set the entry back to readonly 
     m[i][2].config(state='readonly') 
+1

Vous devez renommer 'master' car c'est un nom très trompeur. Le nom canonique est 'event', bien que certains préfèrent' evt'. –

0

Merci beaucoup pour votre aide. Je suis nouveau en python et tkinter. J'ai résolu le problème. Remerciements à:

Bryan Oakley et Jordan Gleeson

Voici la solution:

from Tkinter import * 

global m 

def indexes(event): 
    for i in range(0, 3): 
     for j in range(0, 3): 
      if event.widget == m[i][j]: 
       return i,j 

def compute(event): 
    i,j = indexes(event) 

    suma=0.0 
    for x in range (0,2): 
     suma+=float(m[i][x].get()) 

    m[i][2].config(state='normal') 
    m[i][2].delete(0, END) 
    m[i][2].insert(0,str(suma)) 
    m[i][2].config(state='readonly') 



root = Tk() 

alto =3 
ancho=3 

sv = [[0 for x in range(alto)] for y in range(ancho)] 
m = [[0 for x in range(alto)] for y in range(ancho)] 

for i in range (0, alto): 
    for j in range (0, ancho): 
     #sv [i] [j] = StringVar() 
     #sv[i][j] = "0.0" 
     m[i][j]= Entry(root)#, textvariable=sv [i] [j]) 
     m[i][j].grid(row = i,column = j) 
     m[i][j].insert(0,"0.0") 
     if (j==0 or j==1): 
      m[i][j].bind('<Return>', compute) 
     else: 
      m[i][j].config(state='readonly') 

root.mainloop()