2011-04-06 20 views
9
from Tkinter import * 
window = Tk() 

frame=Frame(window) 
frame.pack() 

text_area = Text(frame) 
text_area.pack() 
text1 = text_area.get('0.0',END) 

def cipher(data): 
    As,Ts,Cs,Gs, = 0,0,0,0 
    for x in data: 
     if 'A' == x: 
      As+=1 
     elif x == 'T': 
      Ts+=1 
     elif x =='C': 
      Cs+=1 
     elif x == 'G': 
      Gs+=1 

    result = StringVar() 
    result.set('Num As: '+str(As)+' Num of Ts: '+str(Ts)+' Num Cs: '+str(Cs)+' Num Gs: '+str(Gs)) 
    label=Label(window,textvariable=result) 
    label.pack() 

button=Button(window,text="Count", command= cipher(text1)) 
button.pack() 
window.mainloop() 

Lo que estoy tratando de lograr está entrando en una serie de 'AAAATTTCA' en mi widget de texto y tienen la etiqueta de devolución el número de ocurrencias. Con la entrada 'ATC' la función devolvería Num As: 1 Num Ts: 1 Num Cs: 1 Num Gs: 0.Cómo leer el texto de un texto Tkinter Widget

Lo que no entiendo es por qué no estoy leyendo correctamente en mi text_area.

+0

favor guión de codificar correctamente – P2bM

+0

Dada la entrada que mencionas, que en realidad no esperas 1 A, ¿verdad? (Cuento 5). – GreenMatt

Respuesta

12

Creo que malinterpretas algunos conceptos de Python y Tkinter.

Cuando crea el Botón, el comando debe ser una referencia a una función, es decir, el nombre de la función sin el(). En realidad, llama a la función de cifrado una vez, al crear el botón. No puede pasar argumentos a esa función. Necesita usar variables globales (o mejor, para encapsular esto en una clase).

Cuando quiera modificar la etiqueta, solo necesita configurar StringVar. En realidad, su código crea una nueva etiqueta cada vez que se invoca cifrado.

Ver código de abajo para un ejemplo de trabajo:

from Tkinter import * 

def cipher(): 
    data = text_area.get("1.0",END) 

    As,Ts,Cs,Gs, = 0,0,0,0 

    for x in data: 
     if 'A' == x: 
      As+=1 
     elif x == 'T': 
      Ts+=1 
     elif x =='C': 
      Cs+=1 
     elif x == 'G': 
      Gs+=1 
    result.set('Num As: '+str(As)+' Num of Ts: '+str(Ts)+' Num Cs: '+str(Cs)+' Num Gs: '+str(Gs)) 

window = Tk() 

frame=Frame(window) 
frame.pack() 

text_area = Text(frame) 
text_area.pack() 

result = StringVar() 
result.set('Num As: 0 Num of Ts: 0 Num Cs: 0 Num Gs: 0') 
label=Label(window,textvariable=result) 
label.pack() 

button=Button(window,text="Count", command=cipher) 
button.pack() 

window.mainloop() 
+1

aunque realmente no importa en este ejemplo específico, cuando obtiene el texto, debe usar un índice de "end-1c". El widget de texto siempre garantiza una nueva línea al final que normalmente no desea al obtener el texto, ya que no forma parte de lo que el usuario escribió. –

Cuestiones relacionadas