2013-04-22 11 views
8

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

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

---- 22 वें मई 2013 को संपादित करें ------

Jython है समाधान नहीं है क्योंकि matplotlib इसके साथ असंगत है। पायथन में पूरी चीज करना मैं सहमत हूं कि इष्टतम होगा लेकिन मुझे यही काम करना है।

जेएसीओबी जार: मैं एक जेपीनेल या जेएफआरएएम पर एक अलग एप्लिकेशन (बेसमैप) को एम्बेड करने का तरीका दिखाने वाला एक उदाहरण कोड नहीं ढूंढ पाया।

वर्तमान में मैं एक wxpython जीयूआई में बेसमैप एम्बेड करने की योजना बना रहा हूं और फिर दो भाषाओं के बीच संवाद करने के लिए सॉकेट का उपयोग कर रहा हूं।

सर्वर जावा और क्लाइंट पायथन के साथ टीसीपी/आईपी सॉकेट।

+0

संबंधित: http://stackoverflow.com/questions/309158/embedding-an-plication-inside-another- अनुप्रयोग – hyde

+0

कृपया प्रयोग करने के लिए अपना कुछ कोड प्रदान करें। – utapyngo

+0

क्रॉस-प्लेटफ़ॉर्म समाधान नहीं है लेकिन विंडोज़ पर यह मदद करनी चाहिए: [सेटपेरेंट फ़ंक्शन] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633541%28v=vs.85%29.aspx) – utapyngo

उत्तर

2

यह है कि यदि आप नए विचारों के लिए खुले हैं और नई चीजें सीख रहे हैं।
यह आपकी विशिष्ट समस्या का समाधान नहीं है जिसे आप दो भाषाओं में शामिल करना चाहते हैं, यह उस विचार के लिए पाइथन में सबकुछ शामिल करना है।

#!/usr/bin/python 
import pyglet 
from time import time, sleep 

class Window(pyglet.window.Window): 
    def __init__(self): 
     super(Window, self).__init__(vsync = False) 
     self.alive = 1 

     self.click = None 
     self.drag = False 

     with open('map.png', 'rb') as fh: 
      self.geodata_image = pyglet.image.load('map.png', file=fh) 
      self.geo_info = self.geodata_image.width, self.geodata_image.height 

    def on_draw(self): 
     self.render() 

    def on_mouse_press(self, x, y, button, modifiers): 
     self.click = x,y 

    def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers): 
     if self.click: 
      self.drag = True 
      print 'Drag offset:',(dx,dy) 

    def on_mouse_release(self, x, y, button, modifiers): 
     if not self.drag and self.click: 
      print 'You clicked here', self.click, 'Relese point:',(x,y) 
      ## Do work on corindate 
     else: 
      print 'You draged from', self.click, 'to:',(x,y) 
      ## Move or link two points, or w/e you want to do. 
     self.click = None 
     self.drag = False 

    def render(self): 
     self.clear() 
     ## An alternative to only getting a region if you only want to show a specific part of 
     ## the image: 
     # subimage = self.geodata_image.get_region(0, 0, self.geo_info[0], self.geo_info[1]) 
     self.geodata_image.blit(0, 0, 0) # x, y, z from the bottom left corner 
     self.flip() 

    def on_close(self): 
     self.alive = 0 

    def run(self): 
     while self.alive: 
      self.render() 

      ## self.dispatch_events() must be in the main loop 
      ## or any loop that you want to "render" something 
      ## Because it is what lets Pyglet continue with the next frame. 
      event = self.dispatch_events() 
      sleep(1.0/25) # 25FPS limit 

win = Window() 
win.run() 

आप सभी की जरूरत है:


एक submodule के रूप में चलाने का

अजगर mockup Javav को

import sys 
for line in sys.stdin.readline(): 
    if line == 'plot': 
     pass # create image here 
उदाहरण के लिए

+0

धन्यवाद @Torxed। हालांकि मैं मानता हूं कि यह एक समाधान है (यानी पूरे जावा घटक को फेंक दें), मैं एक * जावा * कार्यान्वयन देखने के इच्छुक हूं जो पाइथन उपप्रोसेसर को कॉल करता है और matplotlib आंकड़े प्रस्तुत करता है (इस मामले में एक बेसमैप प्लॉट) जो कर सकता है साथ बातचीत कीजिए। – pelson

+0

वाईडब्ल्यू, मैंने जावा के तहत एक उपप्रोसेसर के रूप में पाइथन स्क्रिप्ट कैसे चलाया जा सकता है और "लाइव" इनपुट सुनने के लिए एक छोटा सा मॉकअप जोड़ा, जिससे आप बिटमैप्स/बेसमैप्स को इंटरैक्ट और पुनः प्रस्तुत करने का विकल्प देते हैं। – Torxed

+0

@Torxed हाँ मैं समझता हूं कि पाइथन में पूरी चीज करना इष्टतम होगा, लेकिन जावा-पायथन इंटरफेसिंग वह है जो मुझे (काम/क्लाइंट से संबंधित सामान) के साथ काम करना है। पाइथन पूरी तरह से Matplotlib-Basemap की इंटरैक्टिव विशेषताओं के कारण। मैंने जेपीएलएल पर पीएनजी छवि को ठीक करने की कोशिश की, लेकिन यह इंटरैक्टिव नहीं है। सभी को धन्यवाद। – javaEd

0

आप निश्चित रूप से पाइथन के जावा कार्यान्वयन, Jython में अपना जीयूआई एम्बेड कर सकते हैं। दुर्भाग्यवश यह matplotlib का समर्थन नहीं करता है, क्योंकि यह देशी कोड पर निर्भर करता है। आप ज्योथन से पायथन का आह्वान करने के लिए execnet को आजमा सकते हैं और उपयोग कर सकते हैं।

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