2011-05-31 10 views
6

मैंने show() के साथ इस समस्या में बार-बार भाग लिया है, और मुझे यकीन है कि मैं कुछ गलत कर रहा हूं लेकिन मुझे जो भी करना है, उसे करने के लिए 'सही' तरीका सुनिश्चित नहीं है।(पायथन) matplotlib pyplot show() .. अवरुद्ध या नहीं?

और [मुझे लगता है कि] क्या मैं चाहता हूँ मुख्य थ्रेड में ब्लॉक करने के लिए जब तक एक घटना जीयूआई धागा में क्या होता है किसी तरह है, कुछ इस तरह पहली बार काम करता है:

from matplotlib import pyplot as p 
from scipy import rand 

im = (255*rand(480,640)).astype('uint8') 
fig = p.figure() 
ax = fig.add_subplot(111) 
ax.imshow(im) 

# just any mutable container for storing a click 
s = [-1, -1] 

def onclick(event): 
    if event.xdata is not None and event.ydata is not None: 
    s[0] = event.xdata 
    s[1] = event.ydata 
    p.close() 

cid = fig.canvas.mpl_connect('button_press_event', onclick) 
p.show() 
print s 

p.show() ब्लॉक जब तक p.close() इवेंट हैंडलर में बुलाया जाता है। लेकिन दूसरी बार एक ही कोड चलाते समय, यह p.show() से पहले दौड़ता है और मूल s, [-1, -1] प्रिंट करता है।

मैंने p.show() पर एक ही प्रोग्राम से एक से अधिक बार कॉल किया जा सकता है या नहीं, इस पर विवादित जानकारी पढ़ी है। ऐसा लगता है कि इसे एक बार इस्तेमाल करने के लिए डिज़ाइन किया गया था, और केवल एक बार स्क्रिप्ट के अंत में। अन्य उपयोग के मामले किसी भी तरह से pyplot तोड़ने लगते हैं (राज्य मशीन?)।

मैं p.draw() और p.ion() और p.ioff() के संयोजन का उपयोग करने की कोशिश की है, लेकिन व्यवहार मैं चाहता था नहीं मिल सका (या तो चीजें ठीक से अवरुद्ध नहीं कर रहे थे या भूखंडों सही समय पर नहीं दिखाई दे रहा थे)।

मैं भी कैसे ईवेंट हैंडलर में सब यहाँ s देखने के लिए सक्षम है के बारे में उलझन में हूँ, और यह है कि क्या इन/आउट जानकारी गुजरने वाले एक गरीब तरीका है। यदि मैं एक सरणी या सूची जैसे एक परिवर्तनीय कंटेनर का उपयोग नहीं करता हूं, तो जो ईवेंट मैं ईवेंट हैंडलर द्वारा सेट करना चाहता हूं, वह स्थानीय चर के रूप में खो जाता है। क्या कोई और तरीका है जिसे मैं याद कर रहा हूं, जहां जीयूआई थ्रेड मुख्य धागे पर सिग्नल पास कर सकता है? जारी रखने से पहले घटना हैंडलर से संकेत के लिए, आवधिक मतदान या व्यस्त प्रतीक्षा के बिना, मुख्य रूप से अवरुद्ध करने का कोई तरीका है?

तो मुझे लगता है कि अंत में मेरी मुख्य सवाल यह है:

वहाँ p.show() के लिए एक साफ प्रतिस्थापन, करता है कि मैं क्या चाहते है (p.show() रूप में एक ही व्यवहार पहली बार है), या कोड के इस प्रकार एक की आवश्यकता होती है पूर्ण पुनर्विचार/पुनः लिखना? अलग-अलग गुणवत्ता की

उत्तर

1

मैं आज मेरी समस्या का समाधान करने में सक्षम था नियंत्रित कर सकते हैं।

:

मैं इस पैरा शीर्षक एकाधिक कॉल matplotlib वेबपेज के what's new ओर से समर्थित पर दिखाए जाने के देखा: अगर किसी और को show() के व्यवहार को बदलने में रुचि है, कैसे आप यह कर सकते के लिए पर पढ़ें

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

इस में था 'नया क्या है' संस्करण 1.0.1 के लिए, synaptic में संस्करण लिखने के समय अभी भी 0.99.3 पर वापस आ गया है। मैं स्रोत v1.0.1 से डाउनलोड और निर्माण करने में सक्षम था। निर्भरता को पूरा करने के लिए मुझे आवश्यक अतिरिक्त पैकेज libfreetype6-dev tk-dev tk8.5-dev tcl8.5-dev python-gtk2-dev थे।

matplotlib.__version__ == 1.0.1 साथ अब

, निम्नलिखित कोड ब्लॉक मैं कैसे उम्मीद करेंगे:

import matplotlib.pyplot as p 
from scipy import eye 
p.imshow(eye(3)) 
p.show() 
print 'a' 
p.imshow(eye(6)) 
p.show() 
print 'b' 
p.imshow(eye(9)) 
p.show() 
print 'c' 
2

युगल विचार:

आप एक वैश्विक चर जा रहा पसंद नहीं है, तो आप onclick कर सकता है() एक प्रतिदेय उद्देश्य यह है कि के लिए देते।

आपका कॉलबैक प्रोग्राम प्रवाह (थोड़ा गंदे) को नियंत्रित करने के लिए लॉक प्राप्त/रिलीज़ कर सकता है।

आप प्रोग्राम प्रवाह को नियंत्रित करने के लिए सक्रिय रूप से मतदान कर सकते हैं (बहुत गंदे)।

आप मैन्युअल रूप से() fig.canvas.draw के माध्यम से अपने आंकड़ों के ड्राइंग

+0

आपके विचारों के लिए धन्यवाद। मैं स्रोत से एमपीएल बनाकर शो() के अवरुद्ध व्यवहार को बदलने में सक्षम था। – wim

0

मैं कोड

  1. सीधे अजगर interpretor भीतर (कमांड लाइन) चल के बीच एक अंतर देखा

  2. इसे एक पायथन लिपि में डालकर इसे कमांड लाइन से चला रहा है ("पायथन script.py")

दोनों एक अवरोधक व्यवहार देते हैं, जो ठीक है।

व्याख्याकर्ता से दोनों छवियां दिखाई देती हैं, कमांड लाइन से केवल पहले दिखाई देती है।

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