2013-05-23 5 views
7

में माउस स्थिति कैसे सेट कर सकता हूं मेरे पास एक 3 डी प्रतिपादन प्रोग्राम है जो स्क्रीन पर माउस की स्थिति के आधार पर एक पर्यवेक्षक के आस-पास की दुनिया को घुमाता है। रेडियन में राशि है कि दुनिया में घुमाया जाता है इस लाइन द्वारा परिभाषित किया गया हैमैं टिंकर विंडो

glob.worldx=-(w.winfo_pointerxy()[0]-xy[0])/250 

कहाँ xy [0] है एक्स स्क्रीन के केंद्र के समन्वय

इसका मतलब है कि राशि है कि पर्यवेक्षकों के क्षेत्र दृश्य घुमाया जा सकता है माउस दूरी से दूरी तक सीमित है। अगर मैं स्क्रीन के केंद्र में वापस आने के लिए माउस प्राप्त कर सकता हूं तो मैं इस समस्या को हल कर सकता हूं। कोई विचार?

+0

सूचक चलती करने के बजाय, शायद सूचक नियंत्रण * गति * जिसके साथ दुनिया घूमता की स्थिति बनाने - केंद्र से आगे तेजी से घूर्णन। – unutbu

+0

यह एक महान सुझाव है, और मैं उस नियंत्रण योजना का उपयोग करता था, लेकिन यह उपयोगकर्ता के अनुकूल नहीं है जैसा कि मैं चाहता था, इसलिए मुझे ऐसा लगता है कि पहले व्यक्ति शूटर गेम को नियंत्रित किया जाता है – sam

उत्तर

7

अच्छी खबर यह है कि ऐसा करने का एक तरीका है।

मध्यवर्ती समाचार यह है कि यह अच्छी तरह से प्रलेखित नहीं है।

बुरी खबर यह है कि यह केवल कुछ प्लेटफॉर्म पर काम करता है।

अन्य मध्यवर्ती समाचार यह है कि आप कम से कम कुछ प्लेटफार्मों पर कम से कम कदम उठा सकते हैं।


Tcl/टी में यह करने के लिए जिस तरह से -warp 1 के साथ एक <Motion> घटना पैदा कर रहा है। इस पर प्रलेखन स्पैस है, और कुछ अलग-अलग पृष्ठों के चारों ओर बिखरा हुआ है (bind पर शुरू करें), लेकिन विवरण here वर्णित हैं। असल में, यह सिर्फ यह है:

event generate . <Motion> -warp 1 -x 50 -y 50 

तो, आप टिंकर से यह कैसे करते हैं?

खैर, event_generate कहीं भी दर्ज है नहीं, और न तो <Motion> घटना, या warp पैरामीटर है ... लेकिन यह अगर आप जानते हैं Tkinter के लिए कैसे टी नक्शे यह पता लगाने की बहुत सरल है:

window.event_generate('<Motion>', warp=True, x=50, y=50) 

और यह वास्तव में एक घटना उत्पन्न करता है, जैसा कि आप <Motion> बाध्यकारी द्वारा देख सकते हैं। यहाँ एक सरल परीक्षण कार्यक्रम है:

from tkinter import * 

root = Tk() 

def key(event): 
    root.event_generate('<Motion>', warp=True, x=50, y=50) 

def motion(event): 
    print('motion {}, {}'.format(event.x, event.y)) 

root.bind('<Key>', key) 
root.bind('<Motion>', motion) 
root.mainloop() 

भागो यह, यकीन है कि यह, ध्यान केंद्रित किया है कर्सर चारों ओर ले जाने बनाने के लिए खिड़की पर क्लिक करें, और आप इसे कुछ इस तरह का प्रिंट आउट देखेंगे:

motion 65, 69 
motion 65, 70 
motion 65, 71 

एक कुंजी मारा, और यह इस प्रिंट आउट करेंगे:

motion 50, 50 

कौन सा महान कर्सर सोच में सिवाय इसके कि यह वास्तव में अपने कर्सर ले जाने में सक्षम नहीं हो सकता है ... है, ऐसी स्थिति में यह सब करता है चाल टी है ले जाया गया।

  • मैक: काम नहीं करता


    विभिन्न मंचों स्कीम करने से, यह की तरह लग रहा है।

    • आपके पास 8.6 रुपये या बाद में होना चाहिए (issue 2926819 देखें)। और आप probably have 8.5.something
    • लेकिन कोको एपीआई के पास जाना मुश्किल नहीं है।
  • विंडोज़: आमतौर पर काम करता है।
    • आपके पास 8.4.कुछ या बाद में होना चाहिए। मुझे इसके लिए बग नहीं मिल सका, लेकिन आप पाइथन 2.7 या 3.x + के किसी भी आधिकारिक विंडोज बाइनरी इंस्टॉलेशन के साथ 8.4 पर भरोसा कर सकते हैं।
    • आपको एक पूर्ण-स्क्रीन ऐप भी नहीं चलाना चाहिए (जिसे आप आम तौर पर नहीं कर रहे हैं)।
    • Vista पर और बाद में, कुछ मामलों में यह काम नहीं करेगा। इसमें डेस्कटॉप सत्र का स्वामित्व नहीं है या स्थानीय कंसोल सत्र नहीं होने के साथ ऐसा कुछ हो सकता है, या इसे प्रशासक या अन्य विशेषाधिकारों की आवश्यकता के साथ करना पड़ सकता है।
    • यदि यह काम नहीं करता है, तो Win32 API पर जाना आसान है।
  • X11 (सबसे लिनक्स, * बीएसडी, आदि): आमतौर पर
    • आपका विंडो प्रबंधक सूचक warping से विकलांग दूसरे ग्राहकों नहीं होना चाहिए। सौभाग्य से, ऐसा करने के लिए एक आम बात प्रतीत नहीं होती है।
    • यदि आपको यह समस्या है, तो इसके आसपास कोई रास्ता नहीं है।
  • अन्य प्लेटफ़ॉर्म (आईओएस, एंड्रॉइड, आदि): कोई विचार नहीं।

मैक के लिए, आप NSMouseMoved ईवेंट जेनरेट और भेजना चाहते हैं। आसान तरीका यह करने के लिए pyobjc साथ है (जो आप एप्पल के अजगर उपयोग कर रहे हैं में बनाया गया है, अन्यथा आप इसे स्थापित करने के लिए है):

app = Foundation.NSApplication.sharedApplication() 
event = Foundation.NSEvent.mouseEventWithType_location_modifierFlags_timestamp_windowNumber_context_eventNumber_clickCount_pressure_(
    Foundation.NSMouseMoved, (50, 50), 0, 0, 
    app.mainWindow().windowNumber(), None, 0, 0, 0.0) 
app.sendEvent_(event) 

Windows के लिए, आप SetCursorPos एपीआई कॉल करें, या उत्पन्न करना चाहते हैं और एक माउस भेजें। पूर्व के साथ काम नहीं करेगा, उदाहरण के लिए, डायरेक्टएक्स गेम्स; उत्तरार्द्ध दूरस्थ डेस्कटॉप के साथ काम नहीं कर सकता है। इस मामले के लिए, आप शायद पूर्व चाहते हैं। किसी भी तरह से, यह करने के लिए सबसे आसान तरीका है pywin32 स्थापित करने के लिए है, और फिर यह सिर्फ है:

win32api.SetCursorPos((50, 50)) 
+0

यह काम कर रहा है मुझे विंडोज 7 पर। – Tim

+0

@Tim: बढ़िया! मैंने थोड़ा और शोध किया; मुझे चीजों को अपडेट करने दें। – abarnert

+0

एक आकर्षण की तरह काम करता है! क्या कोई रास्ता दबाए बिना मैं ऐसा कर सकता हूं? माउस मोशन इवेंट में root.event_generate फ़ंक्शन डालने का सबसे नज़दीक है, लेकिन यह बहुत धीरे-धीरे अपडेट होता है – sam

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