Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
来自Java的Python GUI_Java_Python_Runtime.exec_Matplotlib Basemap - Fatal编程技术网

来自Java的Python GUI

来自Java的Python GUI,java,python,runtime.exec,matplotlib-basemap,Java,Python,Runtime.exec,Matplotlib Basemap,我正在开发一个程序,该程序接受用户输入并生成地图投影图的输出。 我找到的最简单的地图投影库是matplotlib basemap,它是用python编写的,python是我不太熟悉的语言(我在Java上工作),我用Java编写了用户界面。目前,我正在执行python代码,并使用Runtime和exec()命令调用“.py”文件发送包含数据的命令数组。 这将执行命令并将绘图显示为单独的窗口 我的问题是: 是否可以在Jpanel上嵌入此底图(与缩放功能交互)?或者在python GUI上,然后可以将

我正在开发一个程序,该程序接受用户输入并生成地图投影图的输出。 我找到的最简单的地图投影库是matplotlib basemap,它是用python编写的,python是我不太熟悉的语言(我在Java上工作),我用Java编写了用户界面。目前,我正在执行python代码,并使用Runtime和exec()命令调用“.py”文件发送包含数据的命令数组。 这将执行命令并将绘图显示为单独的窗口

我的问题是: 是否可以在Jpanel上嵌入此底图(与缩放功能交互)?或者在python GUI上,然后可以将其嵌入到JPanel上? 我知道我可以将matplotlib生成的图像保存为一个文件,该文件可以固定在面板上,但这样它就不会是交互式的,缩放功能也就不可用了。 还是使用基于Java的工具而不是basemap更合适?(我还没有找到任何这样好的工具)

----2013年5月22日编辑------

Jython不是解决方案,因为matplotlib与它不兼容。我同意用python完成整个工作是最佳的,但这是我必须要做的

JACOB Jar:我找不到一个示例代码来说明如何在JPanel或JFrame上嵌入一个单独的应用程序(basemap)

目前,我计划将basemap嵌入wxpython GUI,然后使用套接字在两种语言之间进行通信


带有服务器Java和客户端Python的TCP/IP套接字

如果你愿意接受新思想,学习新事物。
对于您想要加入两种语言的特定问题,这并不是一个解决方案,而是将所有内容都纳入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()
您所需要的只是:

  • (或3)

作为Javav的子模块运行的Python模型
例如。

您当然可以将GUI嵌入到Python的Java实现中。不幸的是,它不支持matplotlib,因为它依赖于本机代码。您可以尝试从Jython调用Python。

相关:请提供一些代码进行实验。不是跨平台解决方案,但在Windows上这应该会有帮助:我忍不住要问,但使用Jython能帮到您吗?我对Java不太熟悉,但是,是否可以从Python脚本返回地图投影图,然后让您的GUI全部为Java?似乎在将一个GUI嵌入另一个GUI时会遇到一些问题,但我可能错了。dc5553,我不相信这会有帮助,你可以把Jython编译成一个.jar,但这没有多大帮助,我认为基本上破解Java解释器并从中提取东西要困难得多。谢谢@Torxed。虽然我同意这是一个解决方案(即扔掉整个Java组件),但我很想看到一个Java实现,它调用Python子进程并呈现matplotlib图形(在本例中为Basemap plot),可以与.Yw交互,我添加了一个小模型,演示了如何在Java下作为子进程运行Python脚本,并侦听“实时”输入,让您可以选择交互和重新呈现位图/底图。@Torred Yes我知道用Python完成整个任务将是最佳的,但Java Python接口是我必须处理的(工作/客户机相关的东西)。Python完全是因为Matplotlib basemap的交互特性。我尝试在Jpanel上修复png图像,但它不是交互式的。谢谢。
import sys
for line in sys.stdin.readline():
    if line == 'plot':
        pass # create image here