2013-06-16 4 views
3

Я пытаюсь активировать функцию обратного вызова в качестве типа пользователя в поле ввода tkinter. По effbot.org,tkinter variable trace method

Вы можете использовать метод трассировки для прикрепления «наблюдатель» обратных вызовов к переменным . Обратного вызова вызывается всякий раз, когда изменить содержание:

Так я устал это,

import Tkinter as tk 
window2=tk.Tk() 
anf_frame1=tk.Frame(window2,bg='white',relief='groove',bd=0,width=1190,height=175) 
anf_frame1.place(x=10,y=50) 

def myfunction(*args): 
     print 'pass' 
stringvar1 = tk.StringVar(anf_frame1) 
stringvar1.trace("w", myfunction) 
anf_fault_entry=tk.Entry(anf_frame1,width=35,font=('calibri',(14)),bg='white',textvariable=stringvar1) 
anf_fault_entry.grid(row=2,column=1,padx=(5,5)) 

window2.mainloop() 

выше скрипт работает fine.But, когда я скопировать это мой основной сценарий, он не печатает вне 'pass' больше. Это тоже не дает мне никакой ошибки.

Я подтвердил, что нет другого имени переменной stringvar1 и такого же имени функции myfunction. И нет ошибки опечатки, поскольку я просто использовал функцию копирования пасты.

Я теперь озадачен, почему он не работает, когда я копирую его в свой основной сценарий.

Только для информации мой основной скрипт работает так, как он должен, прежде чем копировать обратный вызов и после него. Мой главный скрипт имеет окно tkinter с несколькими ярлыками и полями ввода, которые не должны влиять на описанную выше операцию. Что вызывает проблему? Я что-то пропустил?

--- EDIT ---

def Entrybox_002(): 
    def myfunction(*args): 
      print 'pass' 

    window2=tk.Toplevel(root) 
    md1.Drag_Window(window2, nf_sizex, nf_sizey, nf_posx, nf_posy, nf_title, nf_titlesize,nf_level)  
    ''' New Entry labels & Dropdowns''' 
    #Frame to hold labels 
    anf_frame1=tk.Frame(window2,bg='white',relief='groove',bd=0,width=1190,height=175) 
    anf_frame1.place(x=10,y=50) 
    anf_frame2=tk.Frame(window2,bg='#CCF1FF',relief='groove',bd=0,width=700,height=85) 
    anf_frame2.place(x=50,y=140) 

    label_list=['JCN','Fault','System','Sub-System','Status','Faultcode'] 
    for i in range (6): 
     tk.Label(anf_frame1,text=label_list[i],font=('calibri',(16)),bg='white').grid(row=1,column=i,padx=(40,40),pady=(5,5)) 

    anf_jcn_number=tk.Label(anf_frame1,text=Calculate_linenumber(),font=('calibri',(16)),bg='white',fg='blue') 
    anf_jcn_number.grid(row=2,column=0) 


    stringvar1 = tk.StringVar(anf_frame1)  
    stringvar1.trace("w", myfunction) 
    anf_fault_entry=tk.Entry(anf_frame1,width=35,font=('calibri',(14)),bg='white',textvariable=stringvar1) #<------------------------ENTRY BOX THAT I AM TRYING TO TRACE 
    anf_fault_entry.grid(row=2,column=1,padx=(5,5)) 

    anf_system_menu = md1.MyOptionMenu(anf_frame1, 'Select System', anf_system_choices,Subsytem_display) 
    anf_system_menu.grid(row=2,column=2,padx=(5,5)) 
    (anf_system_menu.var).trace("w",myfunction) 

    anf_status_menu = md1.MyOptionMenu(anf_frame1, 'Select Status', anf_status_choices,Subsytem_display) 
    anf_status_menu.grid(row=2,column=4,padx=(5,5)) 
    (anf_status_menu.var).trace("w",myfunction) 


    anf_faultcode_menu1 = md1.MyOptionMenu(anf_frame1, 'When fault found?', anf_faultcode_1,Operational_effect) 
    anf_faultcode_menu1.grid(row=2,column=5,padx=(5,5)) 
    (anf_faultcode_menu1.var).trace("w",myfunction) 

    anf_date_button=tk.Button(anf_frame2,image=images.adf_date_chooser,text='Date',compound='left',font=('calibri',(12),'italic'),bg='white',command=Create_calendar) 
    anf_date_button.grid(row=1,column=0,padx=(15,15),pady=(5,5)) 

    anf_ownership=tk.Label(anf_frame2,text='Reported by',font=('calibri',(14),'italic'),bg='#CCF1FF') 
    anf_ownership.grid(row=1,column=1,padx=(15,15),pady=(5,5)) 

    anf_date_label=tk.Label(anf_frame2,text=today_date,font=('calibri',(14),'italic'),bg='#CCF1FF',fg='blue') 
    anf_date_label.grid(row=2,column=0,padx=(15,15),pady=(5,5)) 

    anf_button1=tk.Button(window2,text='Submit',relief='groove',bd=1,font=('calibri',(12)),bg='green',padx=10,pady=3,command=Submit_Newfault) 
    anf_button1.place(x=1100,y=175) 
    anf_button1.config(state='normal',bg='grey') 

Это функция, которая создает поле ввода (anf_fault_entry) я спрашивал о. Он находится в окне верхнего уровня с другими несколькими виджетами. Я попытался проследить другие меню опций (например, anf_system_menu и anf_subsystem_menu), используя ту же функцию, что и для окна ввода, но, похоже, для этого меню параметров отлично работает. Я понятия не имею, что происходит.

+0

Ваш главный сценарий имел вызов mainloop()? и теперь два вызова mainloop()? – falsetru

+0

Не видя неработающего кода, мы не можем догадаться, что вы сделали неправильно. –

+0

@falsetru есть только 1 вызов mainloop() как следует. Что еще более озадачивает то, что я добавил 1 новый optionmenu и проследил «stringvar» этого optionmenu с тем же funtion, и он отлично работает, как и следовало бы ... что, возможно, пошло не так? –

ответ

3

stringvar1 - это сбор мусора (удаляется) при возврате функции Entrybox_002.

Обход:

stringvar1 = window2.stringvar1 = tk.StringVar(value='asdf') 

Я рекомендую вам код Entrybox_002 как класс, и stringvar1, как например атрибут сохранить ссылку.

+0

Спасибо вам большое. что исправил проблему. Я потратил последние 2 часа на устранение этой проблемы. я новичок, поэтому я понятия не имею о сборщике мусора. Мне нужно больше узнать об этом. –