来自Java的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 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上,然后可以将
带有服务器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