पर मैं एक जीयूआई-आधारित अनुप्रयोग बनाने की प्रक्रिया में हूं जो कि मौजूदा पायथन बीडीबी मॉड्यूल के शीर्ष पर बनाता है जो पाइथन/टिंकर के साथ एक जीयूआई आधारित अनुप्रयोग बनाने की प्रक्रिया में है। इस एप्लिकेशन में, मैं कंसोल से सभी stdout/stderr को चुप करना चाहता हूं और इसे अपने जीयूआई पर रीडायरेक्ट करना चाहता हूं। इस उद्देश्य को पूरा करने के लिए, मैंने एक विशेष Tkinter लिखा है। अगला ऑब्जेक्ट (पोस्ट के अंत में कोड)।सेक्शनमेंट गलती sykinstout को tkinter.ext विजेट
मूल विचार यह है कि जब sys.stdout को कुछ लिखा जाता है, तो यह रंगीन रंग के साथ "टेक्स्ट" में एक पंक्ति के रूप में दिखाई देता है। यदि sys.stderr को कुछ लिखा गया है, तो यह रंग लाल रंग के साथ "पाठ" में एक पंक्ति के रूप में दिखाई देता है। जैसे ही कुछ लिखा जाता है, टेक्स्ट सबसे हालिया रेखा को देखने के लिए हमेशा नीचे स्क्रॉल करता है।
मैं इस समय पाइथन 2.6.1 का उपयोग कर रहा हूं। मैक ओएस एक्स 10.5 पर, यह बहुत अच्छा काम करता प्रतीत होता है। मुझे इसके साथ शून्य समस्याएं हैं। रेडहाट एंटरप्राइज़ लिनक्स 5 पर, हालांकि, मुझे एक स्क्रिप्ट के चलाने के दौरान बहुत से विश्वसनीयता गलती मिलती है। सेगमेंटेशन गलती हमेशा एक ही स्थान पर नहीं होती है, लेकिन यह हमेशा बहुत अधिक होती है। अगर मैं अपने कोड से sys.stdout=
और sys.stderr=
लाइनों पर टिप्पणी करता हूं, तो सेगमेंटेशन दोष दूर जाने लगते हैं।
मुझे यकीन है कि इसके आस-पास के अन्य तरीके भी हैं जिनसे मुझे शायद सहारा लेना पड़ेगा, लेकिन क्या कोई भी कुछ भी देख सकता है जो मैं यहां गलत तरीके से गलत कर रहा हूं जो इन विभाजन दोषों का कारण बन सकता है? यह मुझे पागल कर रहा है। धन्यवाद!
पीएस - मुझे लगता है कि जीयूआई में sys.stderr को रीडायरेक्ट करना एक अच्छा विचार नहीं हो सकता है, लेकिन मुझे अभी भी सेगमेंटेशन दोष मिलते हैं जब भी मैं sys.stdout को रीडायरेक्ट करता हूं और sys.stderr नहीं। मुझे यह भी एहसास है कि मैं इस समय पाठ को अनिश्चित काल तक बढ़ने की इजाजत दे रहा हूं।
class ConsoleText(tk.Text):
'''A Tkinter Text widget that provides a scrolling display of console
stderr and stdout.'''
class IORedirector(object):
'''A general class for redirecting I/O to this Text widget.'''
def __init__(self,text_area):
self.text_area = text_area
class StdoutRedirector(IORedirector):
'''A class for redirecting stdout to this Text widget.'''
def write(self,str):
self.text_area.write(str,False)
class StderrRedirector(IORedirector):
'''A class for redirecting stderr to this Text widget.'''
def write(self,str):
self.text_area.write(str,True)
def __init__(self, master=None, cnf={}, **kw):
'''See the __init__ for Tkinter.Text for most of this stuff.'''
tk.Text.__init__(self, master, cnf, **kw)
self.started = False
self.write_lock = threading.Lock()
self.tag_configure('STDOUT',background='white',foreground='black')
self.tag_configure('STDERR',background='white',foreground='red')
self.config(state=tk.DISABLED)
def start(self):
if self.started:
return
self.started = True
self.original_stdout = sys.stdout
self.original_stderr = sys.stderr
stdout_redirector = ConsoleText.StdoutRedirector(self)
stderr_redirector = ConsoleText.StderrRedirector(self)
sys.stdout = stdout_redirector
sys.stderr = stderr_redirector
def stop(self):
if not self.started:
return
self.started = False
sys.stdout = self.original_stdout
sys.stderr = self.original_stderr
def write(self,val,is_stderr=False):
#Fun Fact: The way Tkinter Text objects work is that if they're disabled,
#you can't write into them AT ALL (via the GUI or programatically). Since we want them
#disabled for the user, we have to set them to NORMAL (a.k.a. ENABLED), write to them,
#then set their state back to DISABLED.
self.write_lock.acquire()
self.config(state=tk.NORMAL)
self.insert('end',val,'STDERR' if is_stderr else 'STDOUT')
self.see('end')
self.config(state=tk.DISABLED)
self.write_lock.release()
बस एक तरफ के रूप में, मैं सुझाव दूंगा कि * सभी * सभी मामलों में स्वचालित रूप से स्क्रॉल नहीं हो रहा है। यदि किसी उपयोगकर्ता ने कुछ देखने के लिए स्क्रॉल किया है और फिर एक नया आइटम जोड़ा जाता है तो वे एक दुखी उपयोगकर्ता होंगे जब वे दृश्यों को बाहर देख रहे हैं। मैं जिस एल्गोरिदम का उपयोग करता हूं वह है, यदि नया टेक्स्ट दर्ज करने से पहले अंतिम पंक्ति दिखाई दे रही है तो मैं स्वचालित रूप से स्क्रॉल करता हूं। अन्यथा मैं नहीं करता। –
अच्छी कॉल। मुझे यकीन है कि कोई जल्द ही "ठीक करने के लिए" सूची में दिखाया गया होगा। –