2011-10-16 10 views
5

टेक्स्ट विजेट में टेक्स्ट को संपादित/जोड़ने/हटाने के लिए अंतिम उपयोगकर्ता क्षमता को दबाने के लिए कैसे करें? (पायथन v3.2 .. और tkinter)केवल python3-tkinter में टेक्स्ट विजेट पढ़ें; क्रॉस प्लेटफ़ॉर्म

बिंदु टेक्स्ट को बदलने/जोड़ने/हटाने की क्षमता को दबाता है लेकिन अन्य सुविधाओं को कस्टेट नहीं करने की क्षमता को दबाता है। शायद एक नोएडिट टेक्स्ट चौड़ा होगा बेहतर नाम होगा।

मैं .text [ 'राज्य'] = 'अक्षम' और यह काम करता कोशिश की है लगभग Windows में ठीक (यह अभी भी उपयोगकर्ता का चयन करें/कॉपी पाठ चयन पर प्रकाश डाला गया, पेज ऊपर/नीचे और ऊपर के लिए अनुमति देता/नीचे बटन काम करते हैं। टूटा हुआ एकमात्र चीज कर्सर को अदृश्य बना देता है।)

लेकिन मैकिन्टॉश पर सबकुछ टूट गया है। कोई प्रकाश डाला, कोई चयन/कॉपी, ... ऊ

के बाद से Tkinter अजगर में व्यावहारिक रूप से कोई प्रलेखन है, मैं खोज की है और पाया कुछ TCL सलाह, एक नया वर्ग निकाले जाते हैं और डालने को दबाने के लिए और हटाना फ़ंक्शंस।

तो, मैं के रूप में इसलिए की कोशिश की है:

class roText(tk.Text): 
    def insert(self,*args,**kwargs): 
     print(" Hey - Im inside roText.insert") 
     pass 
    def delete(self,*args,**twargs): 
     pass  
    def pInsert(self,*args,**twargs): 
     super().insert(*args,**twargs) 

दुर्भाग्य से यह सही काम नहीं किया। स्पष्ट रूप से tkinter उन प्रविष्टियों का उपयोग नहीं करता है और अंतिम उपयोगकर्ता कोड दर्ज/हटाए जाने पर फ़ंक्शन हटा देता है। शायद उन टीसीएल सम्मिलित/हटाए गए कुछ और हैं, और मैंने टीसीएल और स्वाहिली से अनुवाद में कुछ खो दिया है। अंतिम उपयोगकर्ता संपादन पाठ के लिए tkinter.Text का उपयोग क्या करता है? उम्मीद है कि वे आंतरिक नहीं हैं ...

तो, क्या केवल अंतिम उपयोगकर्ता संपादन को दबाने के लिए टेक्स्ट विजेट को संशोधित करने का कोई तरीका है? अंदर डाइविंग के बिना ऐसा करने का कोई तरीका है और आंतरिक टिंकर कोड को ओवरराइड करना है, इसलिए सामान टिंकर के अगले रिलीज़ से नहीं टूटा जाता है?

निष्क्रिय शैल विंडो को देखते हुए, मुझे लगता है कि उन्होंने संपादन को दबाया है (अंतिम पंक्ति को छोड़कर)। तो एक रास्ता है। लेकिन यह क्या है और कितना महंगा है?

उत्तर

2

कारण disabled राज्य मैक पर काम नहीं कर रहा है क्योंकि यह बाध्यकारी को बंद करता है जो विजेट पर ध्यान देता है। फोकस के बिना, मैक पर हाइलाइटिंग दिखाई नहीं देती है। यदि आप राज्य को disabled पर सेट करते हैं लेकिन फिर अक्षम टेक्स्ट विजेट पर ध्यान केंद्रित करने के लिए <ButtonPress-1> पर बाध्यकारी असाइन करें, तो आप टेक्स्ट का चयन और प्रतिलिपि बना सकते हैं और हाइलाइटिंग दिखाएगी।

कर्सर गायब होने के लिए ... तर्कसंगत रूप से, ऐसा होने वाला है। कर्सर उपयोगकर्ता को बताता है "यह वह जगह है जहां पाठ डाला जाएगा"। चूंकि कोई टेक्स्ट सम्मिलित नहीं होगा, क्योंकि उस दृश्य सुराग को उपयोगकर्ता को भ्रमित कर दिया जाएगा। इसके बजाय आप क्या कर सकते हैं, अगर यह वास्तव में महत्वपूर्ण था, तो जहां भी वे कर्सर अनुकरण करने के लिए क्लिक करते हैं, वहां एक छोटी छवि डालना है।

विजेट वास्तव में insert और delete तरीकों का उपयोग करता है कि क्या के बारे में आपके प्रश्न का उत्तर करने के लिए: वास्तविक अंतर्निहित विजेट पर तरीकों डिफ़ॉल्ट बाइंडिंग क्या प्रयोग कर रहे हैं, इसलिए उन्हें एक उपवर्ग में अधिभावी कोई प्रभाव नहीं है। काम करने के लिए आपको सभी डिफ़ॉल्ट बाइंडिंग को फिर से करना होगा। यह करने योग्य है, लेकिन बहुत काम है।

दुर्भाग्य से, यह एक ऐसा क्षेत्र है जहां Tcl में प्रोग्रामिंग वास्तव में, चमकता है क्योंकि आप बस विजेट के insert और delete आदेशों को निष्क्रिय कर सकते है। बेशक, आप इसे सीधे टिंकर में भी कर सकते हैं क्योंकि आखिरकार यह सबकुछ करने के लिए टीसीएल कोड चलाता है, लेकिन इसमें कुछ टीसीएल कोड लिखना शामिल होगा जो पाइथन कोडर के परिप्रेक्ष्य से बहुत अच्छा समाधान नहीं है।

मुझे लगता है कि सबसे अच्छा समाधान, विकलांग राज्य का उपयोग करने के तो तुम क्या चाहते करने के लिए बस इतना बाइंडिंग में जोड़ने के लिए।

यहाँ एक सरल उदाहरण है कि स्पष्ट रूप से एक माउस बटन क्लिक करने पर ही ध्यान केंद्रित की स्थापना करके काम करता है। @BryanOakley यह मुझे कुछ समय लिया के बाद से मैं अपने सुझाव का परीक्षण करने के

import Tkinter as tk 

class SampleApp(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     self.text = tk.Text(width=40, height=20) 
     self.text.bind("<1>", self.set_focus) 
     self.text.insert("end", "\n".join(dir(tk.Tk))) 
     self.text.configure(state="disabled") 
     self.text.pack(fill="both", expand=True) 

    def set_focus(self, event): 
     '''Explicitly set focus, so user can select and copy text''' 
     self.text.focus_set() 

if __name__ == "__main__": 
    app = SampleApp() 
    app.mainloop() 
+0

ठीक है, मुझे मैक पर परीक्षण करने का मौका मिला, और text.focus_set() <1> से जुड़ा हुआ समस्या ठीक हो गई, जैसा आपने कहा था। ** धन्यवाद !!! ** (शायद यह पृष्ठ किसी अन्य समाधान के लिए साफ किया जा सकता है। और मैंने वेब पर कई को देखा है)। दुर्भाग्य से मुझे डर था कि यह स्पष्ट रूप से मैक के लिए टिंकर पोर्ट के साथ कई समस्याओं में से एक था। बटन पर 'हरा' रंग काम नहीं करता है, बटनों पर पाठ को और अधिक दूरी की आवश्यकता होती है (यह एक संकल्प से संबंधित हो सकता है), आदि ... उन लोगों के आसपास काम करना आसान है, और मुझे उम्मीद है कि खराब दिखाई नहीं देगा – Momus

-1

: इस कोड के साथ मैं क्लिक करने के लिए और कड़ी चोट एक क्षेत्र का चयन करने के लिए, या डबल या शब्द और लाइनों का चयन करने के लिए ट्रिपल-क्लिक कर सकती हूं कोई मैक नहीं दुर्भाग्यवश पाइथन का मैक कार्यान्वयन छोटी है। मैं जोड़ दिया है ध्यान, मेरी अक्षम समारोह जो मैं एक खिड़की बनाने और पाठ डालने के बाद फोन यानी, अब पहले कॉल:

self.txt['state'] = 'disabled' 

और फिर

self.txt.focus_set() 

कौन सा है कि मैं क्या लगता है कि तुम है सुझाव दिया।

यह "की तरह" में काम किया। Ie: पाठ का चयन करते समय (क्लिक करें और खींचें या डबल-क्लिक करें) हाइलाइटिंग उस समय के अधिकांश। पायथन में कुछ खराब मेमोरी संदर्भ या ऐसी बग होनी चाहिए: कभी-कभी हाइलाइटिंग पहले काम नहीं करती है, फिर यह अधिक क्लिक करने के बाद (उसी विंडो में) काम करना शुरू कर देती है। कभी-कभी जब प्रोग्राम का आह्वान किया जाता है तो यह बल्ले का सही काम करता है। कभी-कभी Shift-rightArrow कुंजी के साथ चयन करना काम करेगा लेकिन माउस के साथ चयन नहीं करेगा। फिर फिर से काम करना शुरू कर देता है। या यह एक विंडो में ठीक काम करेगा, लेकिन नहीं एक दूसरे से (एक ही कक्षा के दोनों), तो सभी खिड़कियों में काम शुरू होता है ... आदि ...

अच्छी बात है कि फोकस जोड़ने बुरी तरह विंडोज को प्रभावित नहीं किया है में (यानी सभी फोकस के बिना ठीक काम करता है। मुझे लगता है कि इस बिंदु पर मुझे उम्मीद है कि मैक के लिए पाइथन की भविष्य/अगली रिलीज उन बग को ठीक करेगी ..

बीटीडब्ल्यू, ऐसा लगता है कि मैक अनाथ का थोड़ा सा है पाइथन के लिए। विंडोज़ के लिए कार्यान्वयन बहुत अधिक है। मेरा मतलब है कि फोंट खराब दिखते हैं, बटन, आदि .. या यह अलग-अलग स्क्रीन संकल्पों और पायथन बंदरगाहों के कारण हो सकता है जो उन लोगों के लिए खराब खाते हैं। सुनिश्चित नहीं है

वैसे भी। मैक के लिए फोकस का उपयोग करने के लिए आपकी मदद और सुझाव के लिए धन्यवाद।

+0

आपको आवश्यकता है '<1> 'ईवेंट के लिए कॉलबैक में' focus_set' को कॉल करने के लिए, न केवल जब आप विजेट बनाते हैं। यह आपके उत्तर से दिखता है कि आप केवल एक बार फोकस सेट कर रहे हैं। मैं दोहराता हूं: दिखाने के लिए हाइलाइट के लिए, विजेट पर ध्यान केंद्रित होना चाहिए। यदि आप इसे फोकस देते हैं, तो जब भी आप कहीं और क्लिक करते हैं तो यह फोकस खो सकता है। फोकस सेट करने के लिए '<1> 'पर बाध्यकारी जोड़ना सुनिश्चित करेगा कि जब आप चयन करने का प्रयास करते हैं तो यह हमेशा ध्यान केंद्रित करता है (चूंकि कोई चयन हमेशा माउस क्लिक से शुरू होता है)। –

+0

@ ब्रायन ओकले मुझे नहीं पता कि "<1> ईवेंट के लिए कॉलबैक" का क्या मतलब है। ऐसा लगता है कि मेरा अनुमान गलत था ... मेरा अगला अनुमान यह है कि आप मेरे टेक्स्ट गैजेट में कुछ कॉलबैक फ़ंक्शन में एकल क्लिक को बाध्य करने का सुझाव देते हैं जो ... txt.focus_set() और शायद इसे डबल क्लिक के लिए भी करें , और एक तिहाई क्लिक (यदि tkinter अभी तक जांच नहीं किया गया है)> अभी मेरे पास के लिए बाध्यकारी/कॉलबैक है, लेकिन निश्चित रूप से मैं इसके लिए फोकस_सेट() के साथ एक विशेष बाध्यकारी और एक लाइन कॉलबैक कर सकता हूं। मैं परीक्षण करने के लिए कोशिश करूँगा और इसे अपने "मैक क्लाइंट" को भेजूंगा ... धन्यवाद। – Momus

+0

मेरे मूल उत्तर ने कहा "अक्षम पाठ विजेट पर ध्यान केंद्रित करने के लिए को बाध्यकारी असाइन करें"। मैंने सोचा कि पर्याप्त स्पष्ट था, लेकिन स्पष्ट रूप से नहीं। मैंने स्पष्टीकरण के लिए एक उदाहरण जोड़ा है। इसके अलावा, आपको डबल-या ट्रिपल-क्लिक के लिए ऐसा करने की आवश्यकता नहीं है, क्योंकि डबल-या ट्रिपल-क्लिक करने का एकमात्र तरीका पहले एकल क्लिक करना है, इसलिए यह समाधान आपको डबल- या शब्दों और रेखाओं का चयन करने के लिए तीन बार क्लिक करें, साथ ही एक क्षेत्र का चयन करने के लिए क्लिक करें और खींचें। –

2

एक पुराने सवाल जोड़ने से के लिए क्षमा करें, लेकिन मैं इस प्रश्न का उत्तर खोज रहा था भी और अंत में एक समाधान नहीं मिला। जब मैंने पाठ विजेट पर ध्यान केंद्रित किया है और बहुत सरल है, तो मुझे मिला समाधान में कुंजी बाइंडिंग ओवरराइड करना शामिल है। here मिला।

बाइंडिंग एक विजेट की एक बाँध समारोह जहां क्या ओवरराइड करने के लिए किया जाता है की एक स्ट्रिंग और नए कार्य आप इसे कॉल करना चाहते हैं पारित है ओवरराइड करने के लिए।

self.txtBox.bind("<Key>", self.empty) 

कक्षा में कहीं और आपको ईवेंट को संभालने के लिए फ़ंक्शन को परिभाषित करने की आवश्यकता होगी।

def empty(self, event): 
     return "break" 

स्ट्रिंग "ब्रेक" वापस लौटने से ईवेंट हैंडलर आपके कार्य के बाद रोकना जानता है, डिफ़ॉल्ट कार्रवाई जारी रखने के बजाय।

मुझे आशा है कि यह आपके प्रश्न का उत्तर देगा। चीयर्स।

संबंधित मुद्दे