Skip to content

Commit dfd0ee7

Browse files
author
Tom Schimansky
committed
added User-Agent, enhanced customtkinter example, bumped version to 1.13
1 parent 1532daf commit dfd0ee7

7 files changed

Lines changed: 57 additions & 46 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ For example, you can use the standard Google Maps map style or Google Maps
259259
satellite images:
260260
````python
261261
# example tile sever:
262+
self.map_widget.set_tile_server("https://a.tile.openstreetmap.org/{z}/{x}/{y}.png") # OpenStreetMap (default)
262263
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
263264
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
264265
self.map_widget.set_tile_server("http://c.tile.stamen.com/watercolor/{z}/{x}/{y}.png") # painting style

examples/map_with_customtkinter.py

Lines changed: 45 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
1-
import tkinter
21
import customtkinter
32
from tkintermapview import TkinterMapView
43

5-
customtkinter.set_appearance_mode("dark")
6-
customtkinter.set_default_color_theme("dark-blue")
4+
customtkinter.set_default_color_theme("blue")
75

86

97
class App(customtkinter.CTk):
108

11-
APP_NAME = "TkinterMapView with CustomTkinter example"
9+
APP_NAME = "TkinterMapView with CustomTkinter"
1210
WIDTH = 800
1311
HEIGHT = 500
1412

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

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

38-
self.frame_right = customtkinter.CTkFrame(master=self, corner_radius=0, fg_color=self.fg_color)
36+
self.frame_right = customtkinter.CTkFrame(master=self, corner_radius=0)
3937
self.frame_right.grid(row=0, column=1, rowspan=1, pady=0, padx=0, sticky="nsew")
4038

4139
# ============ frame_left ============
4240

41+
self.frame_left.grid_rowconfigure(2, weight=1)
42+
4343
self.button_1 = customtkinter.CTkButton(master=self.frame_left,
4444
text="Set Marker",
45-
command=self.set_marker_event,
46-
width=120, height=30,
47-
border_width=0,
48-
corner_radius=8)
45+
command=self.set_marker_event)
4946
self.button_1.grid(pady=(20, 0), padx=(20, 20), row=0, column=0)
5047

5148
self.button_2 = customtkinter.CTkButton(master=self.frame_left,
5249
text="Clear Markers",
53-
command=self.clear_marker_event,
54-
width=120, height=30,
55-
border_width=0,
56-
corner_radius=8)
50+
command=self.clear_marker_event)
5751
self.button_2.grid(pady=(20, 0), padx=(20, 20), row=1, column=0)
5852

53+
self.map_label = customtkinter.CTkLabel(self.frame_left, text="Tile Server:", anchor="w")
54+
self.map_label.grid(row=3, column=0, padx=(20, 20), pady=(20, 0))
55+
self.map_option_menu = customtkinter.CTkOptionMenu(self.frame_left, values=["OpenStreetMap", "Google normal", "Google satellite"],
56+
command=self.change_map)
57+
self.map_option_menu.grid(row=4, column=0, padx=(20, 20), pady=(10, 0))
58+
59+
self.appearance_mode_label = customtkinter.CTkLabel(self.frame_left, text="Appearance Mode:", anchor="w")
60+
self.appearance_mode_label.grid(row=5, column=0, padx=(20, 20), pady=(20, 0))
61+
self.appearance_mode_optionemenu = customtkinter.CTkOptionMenu(self.frame_left, values=["Light", "Dark", "System"],
62+
command=self.change_appearance_mode)
63+
self.appearance_mode_optionemenu.grid(row=6, column=0, padx=(20, 20), pady=(10, 20))
64+
5965
# ============ frame_right ============
6066

61-
self.frame_right.grid_rowconfigure(0, weight=1)
62-
self.frame_right.grid_rowconfigure(1, weight=0)
67+
self.frame_right.grid_rowconfigure(1, weight=1)
68+
self.frame_right.grid_rowconfigure(0, weight=0)
6369
self.frame_right.grid_columnconfigure(0, weight=1)
6470
self.frame_right.grid_columnconfigure(1, weight=0)
6571
self.frame_right.grid_columnconfigure(2, weight=1)
6672

67-
self.map_widget = TkinterMapView(self.frame_right, corner_radius=11)
68-
self.map_widget.grid(row=0, rowspan=1, column=0, columnspan=3, sticky="nswe", padx=(20, 20), pady=(20, 0))
69-
self.map_widget.set_address("Berlin")
73+
self.map_widget = TkinterMapView(self.frame_right, corner_radius=0)
74+
self.map_widget.grid(row=1, rowspan=1, column=0, columnspan=3, sticky="nswe", padx=(0, 0), pady=(0, 0))
7075

7176
self.entry = customtkinter.CTkEntry(master=self.frame_right,
72-
placeholder_text="type address",
73-
width=140,
74-
height=30,
75-
corner_radius=8)
76-
self.entry.grid(row=1, column=0, sticky="we", padx=(20, 0), pady=20)
77+
placeholder_text="type address")
78+
self.entry.grid(row=0, column=0, sticky="we", padx=(12, 0), pady=12)
7779
self.entry.entry.bind("<Return>", self.search_event)
7880

7981
self.button_5 = customtkinter.CTkButton(master=self.frame_right,
80-
height=30,
8182
text="Search",
82-
command=self.search_event,
83-
border_width=0,
84-
corner_radius=8)
85-
self.button_5.grid(row=1, column=1, sticky="w", padx=(20, 0), pady=20)
86-
87-
self.slider_1 = customtkinter.CTkSlider(master=self.frame_right,
88-
width=200,
89-
height=16,
90-
from_=0, to=19,
91-
border_width=5,
92-
command=self.slider_event)
93-
self.slider_1.grid(row=1, column=2, sticky="e", padx=20, pady=20)
94-
self.slider_1.set(self.map_widget.zoom)
83+
width=90,
84+
command=self.search_event)
85+
self.button_5.grid(row=0, column=1, sticky="w", padx=(12, 0), pady=12)
86+
87+
# Set default values
88+
self.map_widget.set_address("Berlin")
89+
self.map_option_menu.set("OpenStreetMap")
90+
self.appearance_mode_optionemenu.set("Dark")
9591

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

100-
def slider_event(self, value):
101-
self.map_widget.set_zoom(value)
102-
10396
def set_marker_event(self):
10497
current_position = self.map_widget.get_position()
10598
self.marker_list.append(self.map_widget.set_marker(current_position[0], current_position[1]))
@@ -108,6 +101,17 @@ def clear_marker_event(self):
108101
for marker in self.marker_list:
109102
marker.delete()
110103

104+
def change_appearance_mode(self, new_appearance_mode: str):
105+
customtkinter.set_appearance_mode(new_appearance_mode)
106+
107+
def change_map(self, new_map: str):
108+
if new_map == "OpenStreetMap":
109+
self.map_widget.set_tile_server("https://a.tile.openstreetmap.org/{z}/{x}/{y}.png")
110+
elif new_map == "Google normal":
111+
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)
112+
elif new_map == "Google satellite":
113+
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)
114+
111115
def on_closing(self, event=0):
112116
self.destroy()
113117

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#
1111

1212
setup(name="tkintermapview",
13-
version="1.12",
13+
version="1.13",
1414
author="Tom Schimansky",
1515
license="Creative Commons Zero v1.0 Universal",
1616
url="https://github.com/TomSchimansky/TkinterMapView",

tkintermapview/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = "1.12"
1+
__version__ = "1.13"
22

33
from .map_widget import TkinterMapView
44
from .offline_loading import OfflineLoader

tkintermapview/canvas_path.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
class CanvasPath:
1212
def __init__(self,
1313
map_widget: "TkinterMapView",
14-
position_list, color="#3E69CB",
14+
position_list,
15+
color="#3E69CB",
1516
command=None,
1617
name=None,
1718
data: any = None):

tkintermapview/canvas_tile.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ def draw(self, image_update=False):
5656
self.canvas_object = self.map_widget.canvas.create_image(canvas_pos_x,
5757
canvas_pos_y,
5858
image=self.image,
59-
anchor=tkinter.NW)
59+
anchor=tkinter.NW,
60+
tags="tile")
6061
else:
6162
self.map_widget.canvas.coords(self.canvas_object, canvas_pos_x, canvas_pos_y)
6263

tkintermapview/map_widget.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,10 +232,14 @@ def set_overlay_tile_server(self, overlay_server: str):
232232
self.overlay_tile_server = overlay_server
233233

234234
def set_tile_server(self, tile_server: str, tile_size: int = 256, max_zoom: int = 19):
235+
self.image_load_queue_tasks = []
235236
self.max_zoom = max_zoom
236237
self.tile_size = tile_size
237238
self.min_zoom = math.ceil(math.log2(math.ceil(self.width / self.tile_size)))
238239
self.tile_server = tile_server
240+
self.tile_image_cache: Dict[str, PIL.ImageTk.PhotoImage] = {}
241+
self.canvas.delete("tile")
242+
self.image_load_queue_results = []
239243
self.draw_initial_array()
240244

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

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

0 commit comments

Comments
 (0)