2012-02-01 7 views
5

मुझे एक साधारण टिंकर एप्लिकेशन मिला है जो मैंने लिखा है, एक फॉर्म के नीचे कुछ बटन के साथ। मेरा लक्ष्य बटन पर एक पत्र को रेखांकित करने के मानक सम्मेलन का पालन करना है, और उस अक्षर के लिए Alt कुंजी के साथ एक क्रिया को बाध्य करना है (यानी: "_S_ave" के लिए Alt-s)।Alt keypresses के लिए बाध्यकारी बटन?

मैंने "Alt-s", "Alt-KeyPress-s" और "Mod1-s" को बाध्यकारी रूट विंडो बनाने का प्रयास किया है, और कोई भी भरोसेमंद काम नहीं कर रहा है। वे कभी-कभी आग लगते हैं, लेकिन भले ही मेरे पास मेरे ईवेंट फ़ंक्शन पर "रिटर्न ब्रेक" हो, फिर भी "अक्षर" अक्षर एंट्री विजेट पर प्रचार कर रहा है।

मुझे विश्वास है कि यह लिनक्स/एक्स 11 और मॉड 1 बनाम Alt हैंडलिंग के साथ एक मुद्दा है क्योंकि नियंत्रण कुंजी बाइंडिंग लगातार काम करती है। मैं इस मुद्दे के आसपास काम करने के लिए किसी भी सर्वोत्तम प्रथाओं का पता लगाने में सक्षम नहीं हूं, इस प्रकार मेरी अपील यहां।

क्या कोई साझा कर सकता है कि लिनक्स/एक्स 11 में काम कर रहे Alt कुंजी बाध्यकारी कैसे प्राप्त करें?

** एक नमूना

from Tkinter import * 

class GUI: 
    def __init__(self,root): 
     self.root = root 
     e = Entry(self.root) 
     e.grid(column=0,row=0) 
     b = Button(self.root, text="Save", underline = 0) 
     b.grid(column=0,row=1) 
     root.bind("<Alt-s>",self.save) 
     e.focus() 

    def save(self,event=None): 
     print("Hey, you pressed Alt-s!") 
     return "break" 

root = Tk() 
App = GUI(root) 
print("At this point, pressing Alt-s places the s string in the entry widget, and doesn't trigger") 
root.mainloop() 

** अद्यतन 2

के साथ अपडेट किया मैं कुछ समीक्षक मुझे पता है यह अपने सिस्टम, यहां तक ​​कि लिनक्स पर काम करता है लिया है। शायद X11 के लिए मेरे टाइलिंग डब्ल्यूएम या अन्य कॉन्फ़िगरेशन में कोई समस्या है, हालांकि मुझे किसी अन्य X11 GUI ऐप्स के साथ Alt का उपयोग करने में कोई समस्या नहीं है।

मैं इस समस्या निवारण के सुझावों के बारे में सुझावों के लिए खुला हूं।

** अद्यतन 3

मैं xmodmap साथ व्यवहार की समीक्षा कर रहा है, और ऐसा लगता है कि जब मैं Alt_R आवंटित टी कीबाइंडिंग काम करना बंद कर। Xev मैच verbatim द्वारा रिपोर्ट की घटनाओं, और अभी तक रुपये के व्यवहार में परिवर्तन। अभी भी खोदना

** अद्यतन 4

श्री लैंग Tkinter सूची पर एक लिंक समान व्यवहार की व्याख्या में मदद करता है, https://bbs.archlinux.org/viewtopic.php?id=58145 में पाया।

मैंने अपने xmodmap में यह परिवर्तन किया है, और अब Alt अपेक्षा के अनुसार काम करता है। मैं समझ नहीं सकता कि क्यों Alt4R को mod4 को बाध्यकारी Alt_L को प्रभावित करेगा, या यह केवल तभी अनुप्रयोगों को प्रभावित करेगा।

धन्यवाद।

+0

कैसे एक टुकड़ा के बारे में हम कोशिश कर सकते हैं के लिये? –

+0

मैंने सोचा कि मैं इंगित करता हूं कि मैं टाइलिंग डब्लूएम AwesomeWM का उपयोग कर रहा हूं, और सही मोड xmodmapped कुछ और करने के लिए है लेकिन बाएं unmodified है। Emacs, फ़ायरफ़ॉक्स, ओपनऑफिस, और अन्य जीयूआई ऐप्स सामान्य रूप से Alt-key पढ़ते हैं। – Demosthenex

+1

आपका कोड विंडोज एक्सपी में पाइथन 2.7.1 के साथ मेरे लिए लक्षित है। क्षमा करें मैं अब और मदद नहीं कर सकता, मेरे पास लिनक्स मशीन नहीं है। :/ सौभाग्य। – Symon

उत्तर

1

उत्तर यह है कि इसे विंडोज कुंजी (मॉड 4) से बांधने के लिए Alt_R को संशोधित करना समस्या का मूल कारण था। मेरा मानना ​​है कि Alt_L को Mod1 के रूप में काम किया गया है, हालांकि यह स्पष्ट रूप से xmodmap में संशोधित नहीं किया गया था। इसके लिए यह कुछ अंतर्निहित व्यवहार तोड़ दिया होगा, लेकिन केवल तभी ऐप्स के लिए।

आर्क बीबीएस लिंक से Super_L कुंजीकोड को ट्रिगर करने के लिए Alt_R कुंजीकोड को संशोधित करने से व्यवहार को हल किया गया। तो अब Alt_R विंडोज कुंजी के रूप में कार्य करता है, लेकिन Tk Alt_L के साथ कोई भी परिवर्तन नहीं देखता है।

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

मुझे किसी भी विजेट में मॉड 1 कुंजी के लिए डिफ़ॉल्ट अनदेखा बाइंडिंग नहीं दिखाई दे रही थी, और यदि Alt_L ने अचानक Mod1 प्रस्तुत करने का निर्णय लिया जो उस व्यवहार को समझाता है जहां मॉड 1 बाइंडिंग आग लगती है, लेकिन एंट्री विजेट को प्राप्त करने से रोकने के लिए डबल बाइंडिंग की आवश्यकता होती है चाबी।

~/संदर्भ के लिए .Xmodmap:

! ISO_Level3_Shift is what xev reports for my right Alt key 
! mod4 is the Windows key modifier, and tied to WM operations 

! Trying a different approach documented at 
! https://bbs.archlinux.org/viewtopic.php?id=58145 
keycode 108 = Super_L 
remove mod1 = Super_L 

क्या एक गंदा समस्या, एक अप्रत्यक्ष परिवर्तन के माध्यम से एक गैर-दस्तावेजी गर्भित व्यवहार में फेरबदल ... जहां alt काम नहीं कर रहा

+0

एक और संभावित मुद्दा यह है कि यदि आप अपने टीएसी ऐप के लिए ऑब्जेक्ट्स का उपयोग कर रहे हैं, उदाहरण के लिए अपनी खुद की रूट क्लास बनाना और यदि आप पेरेंट क्लास __init__ को कॉल करने में विफल रहते हैं तो टी से विरासत में कमाई, लेकिन काम करता है लेकिन बाइंडिंग में से कोई भी नहीं करता है। मेरे मामले में मैंने एक गलत सुपर() कॉल सेट किया है, बस एक दोस्ताना अनुस्मारक। – Demosthenex

1

मुझे यकीन नहीं है कि यह लिनक्स पर अलग-अलग काम करेगा, लेकिन मुझे लगा कि मैं यह जवाब एक शॉट दूंगा क्योंकि यह दो दिनों के उत्तर के बिना है।

मुझे यकीन है कि अगर यह वाक्य रचना आप या उपयोग कर रहे हैं नहीं है नहीं कर रहा हूँ, लेकिन return break के बजाय कोशिश return ("break")

alt समस्या के लिए के रूप में, हो सकता है की तरह कुछ प्रयास करें:

from Tkinter import * 

class GUI: 
    def __init__(self,root):  
     self.alt = False 
     e = Entry(root) 
     e.pack() 
     e.focus() 
     root.bind("<Alt_L>",self.AltOn) 
     root.bind("<KeyRelease-Alt_L>",self.AltOff) 
     root.bind("<s>",self._s) 

    def AltOn(self,event): self.alt=True 
    def AltOff(self,event): self.alt=False 
    def _s(self,event): 
     if self.alt: 
      #whatever you want to do with alt+s 
      print "ALT S" 
      return ("break") 

root = Tk() 
App = GUI(root) 
root.mainloop() 

संपादित करें: बाँध का वर्णन होता है:

FUNC will be called if the event sequence occurs with an 
    instance of Event as argument. If the return value of FUNC is 
    "break" no further bound function is invoked. 

तो मैं सच में यकीन है कि क्यों तोड़ आप के लिए काम नहीं कर रहा है .. खेद मैं और अधिक मदद नहीं कर सकता नहीं हूँ।

+0

Alt-s विश्वसनीय रूप से काम करने लग रहा था, लेकिन ब्रेक ने "एस" को एंट्री विजेट में जाने से नहीं रोका। मैंने पायथन 2.6.6 और 3.2 (मामूली tweaks के साथ यह चलाने के लिए कोशिश की) की कोशिश की। – Demosthenex

+0

@ सिमॉन: ब्रेक काम नहीं कर रहा है इसका कारण यह है कि विजेट पर बाइंडिंग और विजेट क्लास रूट विंडो या "सब" पर बाइंडिंग से पहले आग लगती है। इस प्रकार, "ब्रेक" चक्र में बहुत देर हो जाती है। –

1

संशोधित जवाब:

मैं काम करने के लिए और प्रवेश के लिए एक दूसरे बाध्यकारी जोड़ने (उबंटू 10.04) द्वारा प्रविष्टि बॉक्स पॉप्युलेट नहीं अपने उदाहरण प्राप्त करने में सक्षम था:

e.bind("<Alt-s>",self.save) 

और OSX पर शेर प्रणाली (एक ही कीबोर्ड) के साथ:

e.bind("<Option-s>",self.save) 

xmodmap (उबंटू 10.04):

xmodmap: up to 4 keys per modifier, (keycodes in parentheses):  
shift  Shift_L (0x32), Shift_R (0x3e) 
lock  Caps_Lock (0x42) 
control  Control_L (0x25), Control_R (0x69) 
mod1  Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd) 
mod2  Num_Lock (0x4d) 
mod3  
mod4  Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf) 
mod5  ISO_Level3_Shift (0x5c), Mode_switch (0xcb) 
+0

मैं उबंटू 10.02 पर स्वयं हूं, और इसे पायथन 2.6.6 और 3.2 (मामूली वाक्यविन्यास सुधारों के साथ) के साथ प्रयास किया। यह Alt-f पर ट्रिगर नहीं हुआ था। – Demosthenex

+0

मेरे प्रयास में, जब तक रूट विंडो का चयन किया गया था, यह ठीक से ट्रिगर करता है। मैं अपने पायथन/टिंकर/टीसीएल संस्करणों की जांच कर रहा हूं ... –

+0

मैं मैला फोकस का उपयोग करता हूं, लेकिन खिड़की का चयन किया गया था। जब मैं अपने मेनू को Alt-key के साथ ट्रिगर करता हूं तो फ़ायरफ़ॉक्स जैसे अन्य जीयूआई ऐप्स ठीक काम करते हैं। – Demosthenex