2010-08-23 9 views
6

सॉर्ट करने के कारण प्रदर्शन जुर्माना डालें/अपडेट करें, मुझे जीटीके ट्रीव्यू (पीईजीटीके का उपयोग करके) में कई पंक्तियां डालने पर या कई पंक्तियों को संशोधित करते समय प्रदर्शन समस्याएं आ रही हैं। समस्या यह है कि प्रत्येक परिवर्तन (सम्मिलन/संशोधन) के बाद मॉडल का सहारा लिया जाता है। इससे जीयूआई कई सेकंड तक लटकने का कारण बनता है। model.set_sort_column_id(SOME_ROW_INDEX, gtk.SORT_ASCENDING) पर टिप्पणी करके छोड़े गए मॉडल को छोड़कर इन समस्याओं को समाप्त कर दिया गया है।GtkTreeView

इसलिए, मैं मॉडल को डालने या संशोधित करते समय सॉर्टिंग को अक्षम करना चाहता हूं, और इसे बाद में पुनः सक्षम कर सकता हूं। दुर्भाग्यवश, सॉर्टिंग को model.set_sort_column_id(-1, gtk.SORT_ASCENDING) से अक्षम नहीं किया जा सकता है।

treeview.freeze_child_notify() 

try: 
    for row in model: 
     # ... change something in row ... 
finally: 
    treeview.thaw_child_notify() 

तो, मैं कैसे छंटाई निष्क्रिय कर सकते हैं: फ्रीज/पिघलाव कार्यों का उपयोग या तो काम नहीं करता है? या थोक आवेषण/संशोधन के लिए एक बेहतर तरीका है?

1) डमी छँटाई

tv.freeze_child_notify() 
sortSettings = model.get_sort_column_id() 
model.set_default_sort_func(lambda *unused: 0) # <-- can also use None but that is slower! 
# model.set_default_sort_func(lambda *unused: 1) <-- slow 
# model.set_default_sort_func(lambda *unused: -1) <-- crash (access violation in gtk_tree_store_move_after?!) 
model.set_sort_column_id(-1, gtk.SORT_ASCENDING) 
# change rows 
model.set_sort_column_id(*sortSettings) 
tv.thaw_child_notify() 
:


समाधान

जानकारी और लिंक के लिए धन्यवाद अपने जवाब में प्रदान की bobince, मैं विकल्पों में से कुछ की जाँच

यह समय लगभग 11 सेकंड से 2 सेकंड तक लाया। वाह! लेकिन बेहतर हो सकता है, यह केवल 1000 पंक्तियों के लिए था।

2) मॉडल निकाला जा रहा है

tv.set_model(None) 
# change rows 
tv.set_model(model) 

कोई उल्लेखनीय अंतर है, 11 सेकंड अपडेट करते समय।

3) डमी छंटाई और PyGTK FAQ

def gen(): 
     tv.freeze_child_notify() 
     sortSettings = model.get_sort_column_id() 
     model.set_default_sort_func(lambda *unused: 0) 
     model.set_sort_column_id(-1, gtk.SORT_ASCENDING) 

     i = 0 
     for row in rowsToChange: 
      i += 1 
      # change something 
      if i % 200 == 0: 
       # freeze/thaw not really necessary here as sorting is wrong because of the 
       # default sort function 
       yield True 

     model.set_sort_column_id(*sortSettings) 
     tv.thaw_child_notify() 
     yield False 

g = gen() 
if g.next(): # run once now, remaining iterations when idle 
    gobject.idle_add(g.next) 

परिणाम से शांत जनरेटर चाल: समाधान 1) में के रूप में ही होने का अनुमान 2 सेकंड, लेकिन जीयूआई इस समय के दौरान प्रतिक्रिया करते हैं। मैं इस विधि को पसंद करता हूं। जरूरत पड़ने पर जीयूआई को कम या ज्यादा प्रतिक्रियाशील बनाने के लिए मॉड्यूलो 200 को tweaked किया जा सकता है।

शायद बेहतर परिणाम प्राप्त करने के लिए gtk.TreeStore को उपclass करना भी संभव है? अभी तक कोशिश नहीं की है, लेकिन विकल्प 3) अब के लिए काफी अच्छा है।

उत्तर

2

लगता है जैसे आप लगभग वहां हैं। आगे के नोट्स के लिए FAQ देखें। विशेष रूप से, आपको default_sort_order भी सेट करना चाहिए (अब आप बेहतर प्रदर्शन के लिए None के साथ-साथ डमी तुलना लैम्ब्डा का उपयोग कर सकते हैं) यह सुनिश्चित करने के लिए कि कोई सॉर्टिंग नहीं है, और संचालन की अवधि के लिए पेड़दृश्य से मॉडल को हटा दें ।

यदि यह बहुत सारे बदलाव हैं तो आप एक नया मॉडल बनाने और स्थापित करने से बेहतर हो सकते हैं।

+0

धन्यवाद, यह वास्तव में सहायक था :) आपके द्वारा प्रदान की गई जानकारी के आधार पर मैंने परीक्षण किए गए कुछ समाधानों के लिए मेरा प्रश्न देखें। – AndiDog