首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在tkinter/python中嵌入Slippy映射

在tkinter/python中嵌入Slippy映射
EN

Stack Overflow用户
提问于 2015-07-27 23:18:23
回答 2查看 3.7K关注 0票数 2

我正在寻找一种在Tkinter应用程序中生成/嵌入一个滑动映射(即OpenStreetMaps)的能力,然后我可以在它上面绘制大地坐标和椭圆数据(来自到*.mdb文件的pyodbc连接)。用户需要地理信息(城市名称等)。为了更有效的分析。

我看过mapnik,传单,pyrender,TileMill,TileStache,等等,以促进这个白日梦,但似乎没有一个真正符合这个要求。数据需要是交互式的(气球信息,可选择,等等)动态(当新用户定义的sql解析数据以进行筛选时进行更新)。原因是,这个程序的另一半是通过Tkinter和MatPlotLib运行的。一个完整的系统大修是我想要避免的。

任何帮助我向正确的方向将不胜感激。

下面是我的一些代码:

)我对任何错误或愚蠢行为事先表示歉意。我只在过去的3次months...all自学中用python写作)

代码语言:javascript
复制
#!/usr/bin/env python
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
import matplotlib.image as mpimg
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure
from tkFileDialog import askopenfilename
from pylab import *
import tkMessageBox as mb
import pyodbc
import sys
import ttk

if sys.version_info[0] < 3:
    import Tkinter as Tk
else:
    import tkinter as Tk

def connect_db():
    global c
    conn = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb)};DBQ=%s' % filename)
    c = conn.cursor()

def query_db():
    global time
    global freq
    global pri
    global pw
    freq=[]
    time=[]
    pri = []
    pw = []

c.execute("SELECT utc_usec_time_stamp, freq_mhz, pri, pw FROM SampleData")
rows = c.fetchall()

for row in rows:
    time.append(row[0])
    freq.append(row[1])
    pri.append(row[2])
    pw.append(row[3])
    progressbar.step(0.0008)
    root.update_idletasks()

def plot(): 
    global sb1
    global sb2
    global sb3
    global canvas

    f = Figure()
    f.clf()
    f.subplots_adjust(bottom=0.05,top=0.98,left=0.08,right=0.98,hspace=0.1)
    sb1 = f.add_subplot(3,1,1)
    sb1.scatter(time,freq)
    setp(sb1.get_xticklabels(), visible=False)
    sb1.set_ylabel("FREQ (MHz)")

    sb2 = f.add_subplot(3,1,2, sharex=sb1)  
    sb2.scatter(time,pri)   
    setp(sb2.get_xticklabels(), visible=False)
    sb2.set_ylabel("PRI (usec)")

    sb3 = f.add_subplot(3,1,3, sharex=sb1)  
    sb3.scatter(time,pw)    
    setp(sb3.get_xticklabels(), visible=False)
    sb3.set_xlabel("TIME")
    sb3.set_ylabel("PW (usec)")

    canvas = FigureCanvasTkAgg(f, master=root)

    logo.pack_forget()

    canvas.show()
    canvas.get_tk_widget().pack(side=Tk.RIGHT, fill=Tk.BOTH, expand=1)

    toolbar = NavigationToolbar2TkAgg( canvas, root )
    toolbar.update()
    canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

def test():
    global pri

    p = Tk.Toplevel(root)
    f = Tk.Frame(p)
    f.pack(side="top")
    f.grid_rowconfigure(1, weight=1)
    f.grid_columnconfigure(4, weight=1)
    lbl = Tk.Label(f, text="label")
    lbl.grid(row=1, column=1)
    e = Tk.Entry(f)
    e.grid(row=1, column=2)
    b = Tk.Button(f, text="Button")
    b.grid(row=1, column=3)
    lbl2 = Tk.Label(f, text=" ")
    lbl2.grid(row=1, column=4, padx=100)

    fig = Figure()
    sb1 = fig.add_subplot(1,1,1)
    sb1.hist(pri)

    canvas = FigureCanvasTkAgg(fig, master=p)

    canvas.show()
    canvas.get_tk_widget().pack(side=Tk.RIGHT, fill=Tk.BOTH, expand=1)

    toolbar = NavigationToolbar2TkAgg( canvas, p )
    toolbar.update()
    canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

def __init__(): 
    global root
    global rmi
    global rma
    global prmi
    global prma
    global pwmi
    global pwma
    global pdf
    global progressbar
    global tf
    global logo

    root = Tk.Tk()
    root.wm_title("Airborne Tactical Analysis System (ATLAS)")
    root.wm_state('zoomed')

    menubar = Tk.Menu(root)
    File = Tk.Menu(menubar, tearoff=0)
    File.add_command(label="Open", command=open)
    File.add_separator()
    File.add_command(label="Exit", command=_quit)
    menubar.add_cascade(label="File", menu=File)
    Options = Tk.Menu(menubar, tearoff=0)
    Options.add_command(label="-Coming Soon-")
    menubar.add_cascade(label="Options", menu=Options)
    PlotData = Tk.Menu(menubar, tearoff=0)
    PlotData.add_command(label="FREQ v PW")
    PlotData.add_command(label="FREQ v PRI")
    PlotData.add_command(label="PRI v PW")
    PlotData.add_command(label="FREQ HISTOGRAM")
    PlotData.add_command(label="PRI HISTOGRAM", command=test)
    PlotData.add_command(label="PW HISTOGRAM")
    menubar.add_cascade(label="Plot Data", menu=PlotData)
    Geo = Tk.Menu(menubar, tearoff=0)
    Geo.add_command(label="Generate Map")
    menubar.add_cascade(label="Geo", menu=Geo)
    root.config(menu=menubar)

    pdf = Tk.Frame(borderwidth=1, relief="sunken")
    pdf.pack(side="left", fill="y")
    pdf.grid_rowconfigure(7, weight=1)
    pdf.grid_columnconfigure(1, weight=1)

    tf = Tk.Frame(borderwidth=1, relief="sunken")
    tf.pack(side="bottom", fill="x")
    progl = Tk.Label(text=" Processing: ")
    progl.pack(in_=tf, side="left", ipady=10)
    progressbar = ttk.Progressbar(orient='horizontal', length=200, mode='determinate')
    progressbar.pack(in_=tf, side="left")
    fl = Tk.Label(text="Current File:")
    fl.pack(in_=tf, side="left", ipadx=10)

    b1 = Tk.Button(pdf, text="Submit", command=filter_builder)
    b1.grid(in_=pdf, row=2, columnspan=3, pady=10)

    buf = Tk.Label(text="   ")
    mil = Tk.Label(text="MIN")
    mal = Tk.Label(text="MAX")
    rfl = Tk.Label(text="RF:")
    pwl = Tk.Label(text="PW:")
    prl = Tk.Label(text="PRI:")
    prmi = Tk.Entry()
    prma = Tk.Entry()
    pwmi = Tk.Entry()
    pwma = Tk.Entry()
    rmi = Tk.Entry()
    rma = Tk.Entry()
    buf.grid(in_=pdf, column=3,row=3)
    mil.grid(in_=pdf, column=1,row=3, pady=4)
    mal.grid(in_=pdf, column=2,row=3)
    rfl.grid(in_=pdf, column=0,row=4)
    rmi.grid(in_=pdf, column=1,row=4)
    rma.grid(in_=pdf, column=2,row=4)
    prl.grid(in_=pdf, column=0,row=5)
    prmi.grid(in_=pdf, column=1,row=5)
    prma.grid(in_=pdf, column=2,row=5)
    pwl.grid(in_=pdf, column=0,row=6)
    pwmi.grid(in_=pdf, column=1,row=6)
    pwma.grid(in_=pdf, column=2,row=6)

    photo = Tk.PhotoImage(file="image.gif")

    logo = Tk.Label(image=photo)
    logo.image = photo
    logo.pack(side="top", fill="both", pady=100)

    root.mainloop()

__init__()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-21 03:35:00

因此,经过大量的研究和修修补补(阅读:深夜和挫折),我终于想出了最好的方法来做到这一点:

1)利用薄荷叶,它利用matplotlib的绘图功能,在一个滑动的地图上呈现数据点。这是我的前端(API)。

2)我无意中在python上发现了GitHub,它实际上符合通过“龙卷风”脱机服务*.mbtiles png数据的要求。我操纵了mplleaflet的urls,以指向我的本地主机端口,在那里,“旋风”正在为要呈现的瓷砖提供服务。

3)在完成这两项工作之后,我意识到Tkinter无法以任何方式解析html,因此我最终将其全部删除,并使用了功能更强大的PySide,因为它包含了我用来在GUI中包含它的QWebKit,而不是实际的web浏览器窗口。

总之,这是一个很长但很有启发性的过程。我希望其他人也能从中吸取教训。

票数 1
EN

Stack Overflow用户

发布于 2022-02-08 21:20:43

这是一个老问题,但如果有人想在应用程序中拥有一个交互式OpenStreetMap地图,我编写了一个名为TkinterMapView的库,用于在Tkinter中显示基于OpenStreetMap或Google的贴片地图:

Documentation: https://github.com/TomSchimansky/TkinterMapView

pip3 install tkintermapview 安装:

您只需创建一个TkinterMapView小部件,就像创建一个框架或按钮一样,并且您有一个交互式地图,您还可以在该地图中设置位置标记或路径。您可以使用坐标或通过向小部件传递地址字符串(如下面的示例所示)将地图集中在特定位置上:

代码语言:javascript
复制
import tkinter
from tkintermapview import TkinterMapView

root_tk = tkinter.Tk()
root_tk.geometry(f"{600}x{400}")
root_tk.title("map_view_simple_example.py")

# create map widget
map_widget = TkinterMapView(root_tk, width=600, height=400, corner_radius=0)
map_widget.pack(fill="both", expand=True)

map_widget.set_address("Berlin Germany", marker=True)

root_tk.mainloop()

上面的代码将为您提供以下窗口:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31664926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档