सॉर्ट करने के कारण प्रदर्शन जुर्माना डालें/अपडेट करें, मुझे जीटीके ट्रीव्यू (पीईजीटीके का उपयोग करके) में कई पंक्तियां डालने पर या कई पंक्तियों को संशोधित करते समय प्रदर्शन समस्याएं आ रही हैं। समस्या यह है कि प्रत्येक परिवर्तन (सम्मिलन/संशोधन) के बाद मॉडल का सहारा लिया जाता है। इससे जीयूआई कई सेकंड तक लटकने का कारण बनता है। 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) अब के लिए काफी अच्छा है।
धन्यवाद, यह वास्तव में सहायक था :) आपके द्वारा प्रदान की गई जानकारी के आधार पर मैंने परीक्षण किए गए कुछ समाधानों के लिए मेरा प्रश्न देखें। – AndiDog