2013-04-22 11 views
8

私はユーザ入力を受け取り、マッププロジェクションプロットとして出力を生成するプログラムに取り組んでいます。 私が見つけた最も簡単なマップ投影ライブラリは、Python言語で書かれたmatplotlib-basemapです(私はJavaで作業しています)。Javaでユーザーインターフェイスを作成しました。現在、私はPythonコードを実行しており、ランタイムとexec()コマンドを使ってデータを持つコマンド配列を ".py"ファイルを呼び出して送信しています。 これはコマンドを実行し、プロットを別のウィンドウとして表示します。Python GUI from Java

私の質問はこれです: このベースマップ(ズーム機能付きの対話型)をJpanelに埋め込むことは可能ですか?または、JPanelに埋め込むことができるPython GUI上で? matplotlibで生成された画像は、パネル上で修正できるファイルとして保存できますが、インタラクティブではありません。ズーム機能は利用できません。 またはベースマップがより適切であるというよりも、Javaベースのツールを使用していますか?

---- 2013年5月22日に編集------

Jythonのです(私はどのように良い見つかっていません) matplotlibはそれと互換性がないため、解決策ではありません。私は同意する最適ですが、これは私が動作しなければならないものです。

JACOB Jar:別のアプリケーション(ベースマップ)をJPanelまたはJFrameに埋め込む方法を示すサンプルコードが見つかりませんでした。

現在、私はベースマップをwxpython GUIに埋め込み、ソケットを使用して2つの言語間の通信を計画しています。

サーバーJavaとクライアントPythonを使用するTCP/IPソケット。

+0

関連:http://stackoverflow.com/questions/309158/embedding-an-application-inside-another-application – hyde

+0

実験するコードの一部を入力してください。 – utapyngo

+0

クロスプラットフォームのソリューションではなく、Windowsではこれが役立ちます:[SetParent function](http://msdn.microsoft.com/en-us/library/windows/desktop/ms633541%28v=vs.85%29.aspx ) – utapyngo

答えて

2

これは、新しいアイデアや新しいことを学ぶことができる場合です。
2つの言語に参加したいというあなたの特定の問題に対する解決策ではありません。これは、Pythonですべてを組み込むというアイデアに代わるものです。

#!/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() 

必要なのは、次のとおりです。

  • Python2(または3)
    import sys 
    for line in sys.stdin.readline(): 
        if line == 'plot': 
         pass # create image here 
    
    0123をJavavするサブモジュールとして動作しているの
  • Pyglet

Pythonのモックアップ例えば、

+0

ありがとう@Torxed。私はこれが解決策であることに同意しますが(つまり、Javaコンポーネント全体を捨てる)、私はPythonのサブプロセスを呼び出すMatlotLibの数値(この場合はBasemapプロット)をレンダリングする* Java *の実装を見たいと思っています。と相互作用する。 – pelson

+0

Yw、私はJavaの下でサブプロセスとしてPythonスクリプトを実行し、ビットマップ/ベースマップをやりとりして再レンダリングするオプションを与える "ライブ"入力をリッスンする方法の小さなモックアップを追加しました。 – Torxed

+0

@Torxedはい私は、Pythonですべてを行うのが最適であることを理解していますが、Java-Pythonのインタフェースは私が扱う必要がある(仕事/クライアント関連のもの)。純粋にPythonはMatplotlib-basemapのインタラクティブな機能のためです。私はJpanelでPNGイメージを修正しようとしましたが、インタラクティブではありません。すべて同じです。 – javaEd

0

PythonのJava実装であるJythonにあなたのGUIを確実に埋め込むことができます。残念ながら、それはネイティブコードに依存しているので、matplotlibをサポートしていません。 execnetを使ってJythonからPythonを呼び出そうとすることができます。