Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
String int confused
#1
ny help to get the proper syntax regarding zoom. (great confusion in tha family).
Anyone?
lblzoomlvl = customtkinter.CTkLabel(window, width=80, font=("Ariel",16,"bold"),text_color="#0000ff", fg_color="#ffffff", text="")
lblzoomlvl.place(x=1160,y=241)

def cmdinczoom(event):
    #read Text from label lblzoomlvl into an integer variable zoom
    temp = lblzoomlvl["text"]
    zoom =int(temp)
    
    if (zoom<16):
        # add 1 to int variable zoom
        zoom=zoom+1
        # update text on label lblzoomlvl 
        lblzoomlvl.configure(text=zoom)
        # set mouse x,y position
        mouse.position = (32,53)
        # click once with left mouse button
        mouse.click(Button.left,1)
        # update text on lblzzoom by zoom
        lblzoomlvl.configure(text=zoom)
    
btninczoom = customtkinter.CTkButton(window, width=20, height=10, font=("Ariel",20,"bold"), border_color="#add19e", fg_color="#aaaaaa",text_color="#000000", text="+",command=cmdinczoom)
lblzoomlvl.[output]Tk.bind("<Up>",cmdinczoom)
  File "D:\Python311\Lib\tkinter\__init__.py", line 1448, in bind
    return self._bind(('bind', self._w), sequence, func, add)
           ^^^^^^^^^^
AttributeError: 'str' object has no attribute '_bind'. Did you mean: 'find'?
PS C:\Users\jan-e> & D:/Python311/python.exe d:/Python311/Scripts/nye.py
PS C:\Users\jan-e> & D:/Python311/python.exe d:/Python311/Scripts/nye.py
PS C:\Users\jan-e> & D:/Python311/python.exe d:/Python311/Scripts/nye.py
PS C:\Users\jan-e> [/output]bind("<Up>",cmdinczoom)
Reply
#2
Try somewidget.bind("<Up>",cmdinczoom) perhaps.
Reply
#3
There is a better way to associate label text with an int. Use a tk.variable.
import tkinter as tk


def cmdinczoom(event):
    print(event)
    increment = {"Up": 1, "Right": 1, "Down": -1, "Left": -1}.get(event.keysym, 0)
    zoom.set(max(1, min(zoom.get() + increment, 16)))


window = tk.Tk()
zoom = tk.IntVar(window, 1)
label = tk.Label(window, width=10, font=("Ariel", 16, "bold"), textvariable=zoom)
label.pack(padx=20, pady=20)
for key in ("<Left>", "<Right>", "<Up>", "<Down>"):
    window.bind(key, cmdinczoom)

window.mainloop()
Why does your key press callback function press a mouse button?
Reply
#4
(Jul-31-2023, 03:15 AM)deanhystad Wrote: There is a better way to associate label text with an int. Use a tk.variable.
import tkinter as tk


def cmdinczoom(event):
    print(event)
    increment = {"Up": 1, "Right": 1, "Down": -1, "Left": -1}.get(event.keysym, 0)
    zoom.set(max(1, min(zoom.get() + increment, 16)))


window = tk.Tk()
zoom = tk.IntVar(window, 1)
label = tk.Label(window, width=10, font=("Ariel", 16, "bold"), textvariable=zoom)
label.pack(padx=20, pady=20)
for key in ("<Left>", "<Right>", "<Up>", "<Down>"):
    window.bind(key, cmdinczoom)

window.mainloop()
Why does your key press callback function press a mouse button?

hello. I am using [url=https://github.com/TomSchimansky/TkinterMapView#create-polygon-from-position-
list]https://github.com/TomSchimansky/TkinterMapView#create-polygon-from-position-list[/url]



I wanted to keep track of zoom level on his app, view lvl on a label and use up and down arrow on keyboard to increase/decrease zoom level 1-16.

I didnt find any direct function in Schimansky app, so I thought I should do it programmatically

Attached Files

Thumbnail(s)
   
Reply
#5
I did consentrate on the arrow up and this solved it:

def pilopp(event):
    tekst = lblzoomlvl.cget("text")
    print(tekst)
    if (int(tekst)<16):
        # set mouse x,y position
        mouse.position = (32,53)
        mouse.click(Button.left,1)
        tekst = int(tekst) + 1
        lblzoomlvl.configure(text=tekst)
window.bind("<Up>",pilopp)
Reply
#6
Why are you setting the mouse position and calling mouse click? Is that supposed to press the zoom button? zoom and set_zoom() are part of the map api, why not use them? You've posted code that uses the set_zoom() function.

Below is something I posted before with the addition of binding the arrow keys to zoom in and out.
import tkinter as tk
from tkintermapview import TkinterMapView


class MyWindow(tk.Tk):
    """A window that selects one of several pages to display."""
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.map = TkinterMapView(self, width=800, height=600, corner_radius=0)
        self.map.pack(expand=True, fill=tk.BOTH)
        self.map.set_position(60.03345, 11.35806)  # Norway
        self.map.set_address("fjellvegen 4, auli, norway", marker=True)
        self.map.set_zoom(16)
        self.zoom_label = tk.Label(self, text="Zoom = 16", font=(None, 24), width=20)
        self.zoom_label.pack(padx=10, pady=10)

        for key in ("<Left>", "<Right>", "<Up>", "<Down>"):
            self.bind(key, self.zoom)

    def zoom(self, event):
        increment = {"Up": 1, "Right": 1, "Down": -1, "Left": -1}.get(event.keysym, 0)
        value = max(1, min(19, self.map.zoom + increment))
        self.zoom_label["text"] = f"Zoom = {value}"
        self.map.set_zoom(value)


MyWindow().mainloop()
Quote:I wanted to keep track of zoom level on his app
The best way to "keep track" of the zoom level is ask the map what the current zoom level is. There are too many ways this can change. You can change the zoom programmatically. You can change the zoom by hitting the zoom in (+) and out (-) buttons. You can zoom using the mouse wheel. There might be a way to have the map tell you when the zoom level changes. I didn't see it, but that doesn't mean it isn't there. If you want to display the current zoom level you could fire off an event that runs periodically to update the zoom display (use tkinter.after()). If you just want to know what the current zoom is, to save in a configuration file for example, just ask the map.zoom.
Reply
#7
(Aug-01-2023, 06:48 PM)deanhystad Wrote: Why are you setting the mouse position and calling mouse click? Is that supposed to press the zoom button? zoom and set_zoom() are part of the map api, why not use them? You've posted code that uses the set_zoom() function.

I wasnt aware of the api, just looked for a function which could possibly inc/dec zoom of the map. So I use the maps own zoom buttons instead. Thats not a good solution. Else I cut out the -/+ buttons and use keyboard down/up instead and plan to block the third mousewheel info as its dependant of mouse config. Do You mind post link to api?

Below is something I posted before with the addition of binding the arrow keys to zoom in and out.
import tkinter as tk
from tkintermapview import TkinterMapView


class MyWindow(tk.Tk):
    """A window that selects one of several pages to display."""
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.map = TkinterMapView(self, width=800, height=600, corner_radius=0)
        self.map.pack(expand=True, fill=tk.BOTH)
        self.map.set_position(60.03345, 11.35806)  # Norway
        self.map.set_address("fjellvegen 4, auli, norway", marker=True)
        self.map.set_zoom(16)
        self.zoom_label = tk.Label(self, text="Zoom = 16", font=(None, 24), width=20)
        self.zoom_label.pack(padx=10, pady=10)

        for key in ("<Left>", "<Right>", "<Up>", "<Down>"):
            self.bind(key, self.zoom)

    def zoom(self, event):
        increment = {"Up": 1, "Right": 1, "Down": -1, "Left": -1}.get(event.keysym, 0)
        value = max(1, min(19, self.map.zoom + increment))
        self.zoom_label["text"] = f"Zoom = {value}"
        self.map.set_zoom(value)
Your code is most elegant :) 

MyWindow().mainloop()
Quote:I wanted to keep track of zoom level on his app
The best way to "keep track" of the zoom level is ask the map what the current zoom level is. There are too many ways this can change. You can change the zoom programmatically. You can change the zoom by hitting the zoom in (+) and out (-) buttons. You can zoom using the mouse wheel. There might be a way to have the map tell you when the zoom level changes. I didn't see it, but that doesn't mean it isn't there. If you want to display the current zoom level you could fire off an event that runs periodically to update the zoom display (use tkinter.after()). If you just want to know what the current zoom is, to save in a configuration file for example, just ask the map.zoom.

Buttons already cuttoff. Mousewheel 3 will too, if possible. Just need the zoom for later rewinding of maparea and its marks/icons/symbols.
Reply
#8
This does save and restore.
import tkinter as tk
from tkintermapview import TkinterMapView


class MyWindow(tk.Tk):
    """A window that displays a  map."""
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.map = TkinterMapView(self, width=800, height=600, corner_radius=0)
        self.map.pack(expand=True, fill=tk.BOTH)
        self.map.set_position(60.03345, 11.35806)  # Norway
        self.map.set_address("fjellvegen 4, auli, norway", marker=True)
        self.map.set_zoom(16)
        self.save()

        # Create save and restore buttons for saving/restoring map position and zoom.
        frame = tk.Frame(self)
        frame.pack(expand=True, fill=tk.X)
        button = tk.Button(frame, text="Save", command=self.save, font=(None, 24))
        button.pack(side=tk.LEFT, expand=True, fill=tk.X)
        button = tk.Button(frame, text="Restore", command=self.restore, font=(None, 24))
        button.pack(side=tk.LEFT, expand=True, fill=tk.X)

        # Bind arrow keys to zooming in/out.
        self.zoom_keys = {"Up": 1, "Right": 1, "Down": -1, "Left": -1}
        for key in self.zoom_keys:
            self.bind(f"<{key}>", self.arrow_zoom)

    def arrow_zoom(self, event):
        """Zoom map using arrow keys."""
        increment = self.zoom_keys.get(event.keysym, 0)
        self.map.set_zoom(self.map.zoom + increment)

    def save(self):
        """Save zoom and position so map can be restored later."""
        self.saved_info = (self.map.zoom, self.map.get_position())

    def restore(self):
        """Restore map to saved zoom and position."""
        zoom, position = self.saved_info
        self.map.set_zoom(zoom)
        self.map.set_position(*position)


MyWindow().mainloop()
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  I am confused with the key and value thing james1019 3 976 Feb-22-2023, 10:43 PM
Last Post: deanhystad
  confused about string formatting barryjo 7 2,007 Mar-06-2022, 02:03 AM
Last Post: snippsat
  Pandas confused DPaul 6 2,581 Sep-19-2021, 06:45 AM
Last Post: DPaul
  is and '==' i'm confused hshivaraj 6 2,728 Sep-15-2021, 09:45 AM
Last Post: snippsat
  Confused with 'flags' tester_V 10 4,941 Apr-12-2021, 03:03 AM
Last Post: tester_V
  Simple Tic Tac Toe but I'm confused Izith 1 2,205 Sep-26-2020, 04:42 PM
Last Post: Larz60+
  I am really confused with this error. Runar 3 3,039 Sep-14-2020, 09:27 AM
Last Post: buran
  Confused on how to go about writing this or doing this... pythonforumuser 3 2,502 Feb-10-2020, 09:15 AM
Last Post: snippsat
  Dazed and confused... RodNintendeaux 10 7,529 May-28-2017, 01:32 PM
Last Post: sparkz_alot

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020