Skip to content

Commit

Permalink
added User-Agent, enhanced customtkinter example, bumped version to 1.13
Browse files Browse the repository at this point in the history
  • Loading branch information
Tom Schimansky committed Jul 20, 2022
1 parent 1532daf commit dfd0ee7
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 46 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,7 @@ For example, you can use the standard Google Maps map style or Google Maps
satellite images:
````python
# example tile sever:
self.map_widget.set_tile_server("https://a.tile.openstreetmap.org/{z}/{x}/{y}.png") # OpenStreetMap (default)
self.map_widget.set_tile_server("https://mt0.google.com/vt/lyrs=m&hl=en&x={x}&y={y}&z={z}&s=Ga", max_zoom=22) # google normal
self.map_widget.set_tile_server("https://mt0.google.com/vt/lyrs=s&hl=en&x={x}&y={y}&z={z}&s=Ga", max_zoom=22) # google satellite
self.map_widget.set_tile_server("http://c.tile.stamen.com/watercolor/{z}/{x}/{y}.png") # painting style
Expand Down
86 changes: 45 additions & 41 deletions examples/map_with_customtkinter.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
import tkinter
import customtkinter
from tkintermapview import TkinterMapView

customtkinter.set_appearance_mode("dark")
customtkinter.set_default_color_theme("dark-blue")
customtkinter.set_default_color_theme("blue")


class App(customtkinter.CTk):

APP_NAME = "TkinterMapView with CustomTkinter example"
APP_NAME = "TkinterMapView with CustomTkinter"
WIDTH = 800
HEIGHT = 500

Expand All @@ -32,74 +30,69 @@ def __init__(self, *args, **kwargs):
self.grid_columnconfigure(1, weight=1)
self.grid_rowconfigure(0, weight=1)

self.frame_left = customtkinter.CTkFrame(master=self, width=150, corner_radius=0)
self.frame_left = customtkinter.CTkFrame(master=self, width=150, corner_radius=0, fg_color=None)
self.frame_left.grid(row=0, column=0, padx=0, pady=0, sticky="nsew")

self.frame_right = customtkinter.CTkFrame(master=self, corner_radius=0, fg_color=self.fg_color)
self.frame_right = customtkinter.CTkFrame(master=self, corner_radius=0)
self.frame_right.grid(row=0, column=1, rowspan=1, pady=0, padx=0, sticky="nsew")

# ============ frame_left ============

self.frame_left.grid_rowconfigure(2, weight=1)

self.button_1 = customtkinter.CTkButton(master=self.frame_left,
text="Set Marker",
command=self.set_marker_event,
width=120, height=30,
border_width=0,
corner_radius=8)
command=self.set_marker_event)
self.button_1.grid(pady=(20, 0), padx=(20, 20), row=0, column=0)

self.button_2 = customtkinter.CTkButton(master=self.frame_left,
text="Clear Markers",
command=self.clear_marker_event,
width=120, height=30,
border_width=0,
corner_radius=8)
command=self.clear_marker_event)
self.button_2.grid(pady=(20, 0), padx=(20, 20), row=1, column=0)

self.map_label = customtkinter.CTkLabel(self.frame_left, text="Tile Server:", anchor="w")
self.map_label.grid(row=3, column=0, padx=(20, 20), pady=(20, 0))
self.map_option_menu = customtkinter.CTkOptionMenu(self.frame_left, values=["OpenStreetMap", "Google normal", "Google satellite"],
command=self.change_map)
self.map_option_menu.grid(row=4, column=0, padx=(20, 20), pady=(10, 0))

self.appearance_mode_label = customtkinter.CTkLabel(self.frame_left, text="Appearance Mode:", anchor="w")
self.appearance_mode_label.grid(row=5, column=0, padx=(20, 20), pady=(20, 0))
self.appearance_mode_optionemenu = customtkinter.CTkOptionMenu(self.frame_left, values=["Light", "Dark", "System"],
command=self.change_appearance_mode)
self.appearance_mode_optionemenu.grid(row=6, column=0, padx=(20, 20), pady=(10, 20))

# ============ frame_right ============

self.frame_right.grid_rowconfigure(0, weight=1)
self.frame_right.grid_rowconfigure(1, weight=0)
self.frame_right.grid_rowconfigure(1, weight=1)
self.frame_right.grid_rowconfigure(0, weight=0)
self.frame_right.grid_columnconfigure(0, weight=1)
self.frame_right.grid_columnconfigure(1, weight=0)
self.frame_right.grid_columnconfigure(2, weight=1)

self.map_widget = TkinterMapView(self.frame_right, corner_radius=11)
self.map_widget.grid(row=0, rowspan=1, column=0, columnspan=3, sticky="nswe", padx=(20, 20), pady=(20, 0))
self.map_widget.set_address("Berlin")
self.map_widget = TkinterMapView(self.frame_right, corner_radius=0)
self.map_widget.grid(row=1, rowspan=1, column=0, columnspan=3, sticky="nswe", padx=(0, 0), pady=(0, 0))

self.entry = customtkinter.CTkEntry(master=self.frame_right,
placeholder_text="type address",
width=140,
height=30,
corner_radius=8)
self.entry.grid(row=1, column=0, sticky="we", padx=(20, 0), pady=20)
placeholder_text="type address")
self.entry.grid(row=0, column=0, sticky="we", padx=(12, 0), pady=12)
self.entry.entry.bind("<Return>", self.search_event)

self.button_5 = customtkinter.CTkButton(master=self.frame_right,
height=30,
text="Search",
command=self.search_event,
border_width=0,
corner_radius=8)
self.button_5.grid(row=1, column=1, sticky="w", padx=(20, 0), pady=20)

self.slider_1 = customtkinter.CTkSlider(master=self.frame_right,
width=200,
height=16,
from_=0, to=19,
border_width=5,
command=self.slider_event)
self.slider_1.grid(row=1, column=2, sticky="e", padx=20, pady=20)
self.slider_1.set(self.map_widget.zoom)
width=90,
command=self.search_event)
self.button_5.grid(row=0, column=1, sticky="w", padx=(12, 0), pady=12)

# Set default values
self.map_widget.set_address("Berlin")
self.map_option_menu.set("OpenStreetMap")
self.appearance_mode_optionemenu.set("Dark")

def search_event(self, event=None):
self.map_widget.set_address(self.entry.get())
self.slider_1.set(self.map_widget.zoom)

def slider_event(self, value):
self.map_widget.set_zoom(value)

def set_marker_event(self):
current_position = self.map_widget.get_position()
self.marker_list.append(self.map_widget.set_marker(current_position[0], current_position[1]))
Expand All @@ -108,6 +101,17 @@ def clear_marker_event(self):
for marker in self.marker_list:
marker.delete()

def change_appearance_mode(self, new_appearance_mode: str):
customtkinter.set_appearance_mode(new_appearance_mode)

def change_map(self, new_map: str):
if new_map == "OpenStreetMap":
self.map_widget.set_tile_server("https://a.tile.openstreetmap.org/{z}/{x}/{y}.png")
elif new_map == "Google normal":
self.map_widget.set_tile_server("https://mt0.google.com/vt/lyrs=m&hl=en&x={x}&y={y}&z={z}&s=Ga", max_zoom=22)
elif new_map == "Google satellite":
self.map_widget.set_tile_server("https://mt0.google.com/vt/lyrs=s&hl=en&x={x}&y={y}&z={z}&s=Ga", max_zoom=22)

def on_closing(self, event=0):
self.destroy()

Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#

setup(name="tkintermapview",
version="1.12",
version="1.13",
author="Tom Schimansky",
license="Creative Commons Zero v1.0 Universal",
url="https://github.com/TomSchimansky/TkinterMapView",
Expand Down
2 changes: 1 addition & 1 deletion tkintermapview/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
__version__ = "1.12"
__version__ = "1.13"

from .map_widget import TkinterMapView
from .offline_loading import OfflineLoader
Expand Down
3 changes: 2 additions & 1 deletion tkintermapview/canvas_path.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
class CanvasPath:
def __init__(self,
map_widget: "TkinterMapView",
position_list, color="#3E69CB",
position_list,
color="#3E69CB",
command=None,
name=None,
data: any = None):
Expand Down
3 changes: 2 additions & 1 deletion tkintermapview/canvas_tile.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ def draw(self, image_update=False):
self.canvas_object = self.map_widget.canvas.create_image(canvas_pos_x,
canvas_pos_y,
image=self.image,
anchor=tkinter.NW)
anchor=tkinter.NW,
tags="tile")
else:
self.map_widget.canvas.coords(self.canvas_object, canvas_pos_x, canvas_pos_y)

Expand Down
6 changes: 5 additions & 1 deletion tkintermapview/map_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -232,10 +232,14 @@ def set_overlay_tile_server(self, overlay_server: str):
self.overlay_tile_server = overlay_server

def set_tile_server(self, tile_server: str, tile_size: int = 256, max_zoom: int = 19):
self.image_load_queue_tasks = []
self.max_zoom = max_zoom
self.tile_size = tile_size
self.min_zoom = math.ceil(math.log2(math.ceil(self.width / self.tile_size)))
self.tile_server = tile_server
self.tile_image_cache: Dict[str, PIL.ImageTk.PhotoImage] = {}
self.canvas.delete("tile")
self.image_load_queue_results = []
self.draw_initial_array()

def get_position(self) -> tuple:
Expand Down Expand Up @@ -417,7 +421,7 @@ def request_image(self, zoom: int, x: int, y: int, db_cursor=None) -> ImageTk.Ph
# try to get the tile from the server
try:
url = self.tile_server.replace("{x}", str(x)).replace("{y}", str(y)).replace("{z}", str(zoom))
image = Image.open(requests.get(url, stream=True).raw)
image = Image.open(requests.get(url, stream=True, headers={"User-Agent": "TkinterMapView"}).raw)

if self.overlay_tile_server is not None:
url = self.overlay_tile_server.replace("{x}", str(x)).replace("{y}", str(y)).replace("{z}", str(zoom))
Expand Down

0 comments on commit dfd0ee7

Please sign in to comment.