Wie erledigen Sie die korrekte Touchscreen -Steuerung in der Kivy App (Python)?

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Wie erledigen Sie die korrekte Touchscreen -Steuerung in der Kivy App (Python)?

by Guest » 28 Jan 2025, 07:04

Guten Tag an alle! Ich stieß in Kivy MapView auf ein Problem. Die App im Telefon zoomt automatisch, wenn sie mit einem Finger berührt wird. Methoden wie Touch_Up () oder Touch_down () aus der Bibliothek funktionieren nicht. Ich habe versucht, es mit window.config (Multitouch = false) zu deaktivieren - es hilft auch nicht. Ich kann nirgendwo eine Lösung finden (
Beim Start auf dem Desktop ist das Verhalten auch unzureichend: Nach dem Scrollen des Zooms mit der Maus tritt durch die linke Taste auf, wenn ich die Karte bewegen kann, ein spontaner Zoom tritt auf. Wie kann ich es loswerden?import sqlite3
from kivy.app import App
from kivy_garden.mapview import MapMarkerPopup
from kivy.uix.label import Label
from kivy.app import Builder
from kivy.core.window import Window

Window.softinput_mode = "below_target"
Window.fullscreen = False

conn = sqlite3.connect('points.db')
cur = conn.cursor()
cur.execute('''CREATE TABLE IF NOT EXISTS objects
(obj_type TEXT, obj_name TEXT, lat FLOAT, lon FLOAT)''')
conn.commit()
conn.close()

class MapApp(App):
def on_start(self):
self.markers = []

def search_point(self, text):
text = text.lower()
conn = sqlite3.connect('points.db')
cur = conn.cursor()
req = f"SELECT * FROM objects WHERE obj_name = '{text}'"
cur.execute(req)
rows = cur.fetchall()
conn.close()
if rows:
for row in rows:
marker_type, marker_name, lat, lon = row
if text in marker_name:
self.root.ids.mapview.center_on(lat, lon)
self.root.ids.input_text.text = ""
self.make_marker(_type=marker_type, name=marker_name, lat=lat, lon=lon)
break

def make_marker(self, _type, name, lat, lon):
marker = MapMarkerPopup(lat=lat, lon=lon, source=f"marker.png")
text_on_marker = Label(text=name, color=(0, 0, 0, 1), size=(100, 40), size_hint=(None, None), font_size=25, bold = 1)
marker.add_widget(text_on_marker)
for pre_marker in self.markers:
self.root.ids.mapview.remove_marker(pre_marker)
self.markers.append(marker)
self.root.ids.mapview.add_marker(marker)
marker.on_release(self.root.ids.mapview)
self.root.ids.mapview.zoom = 15

def build(self):
return Builder.load_file("Map.kv")

if __name__ == "__main__":
MapApp().run()
< /code>
Map.kv
#: import MapView kivy_garden.mapview.MapView
#: import MapMarkerPopup kivy_garden.mapview.MapMarkerPopup

# root
GridLayout:
cols:1

# search_layer
GridLayout:
cols:3
size_hint: (1, 0.1)

# inline_box
TextInput:
id: input_text
multiline: False

# search_btn
Button:
name:"search_markers"
id:search_markers
text: "Search"
size_hint_x: 0.25
on_release:
app.search_point(text=input_text.text)

# map_layer
MapView:
id: mapview
size_hint: (1, 1)
zoom: 12
lat: 40.71427
lon: -74.00597

# red +
canvas:
Color:
rgba: 1, 0, 0, 1
# vertical_line
Line:
points: self.center_x, self.center_y+10, self.center_x, self.center_y-10
width: 2
# horizontal_line
Line:
points: self.center_x+10, self.center_y, self.center_x-10, self.center_y
width: 2
< /code>
p.s. Schauen Sie sich SQLite DB nicht an. Es spielt jetzt überhaupt keine Rolle. Der Code wurde vereinfacht, um mit Touchscreen -Steuerung umzugehen. Die Datenbank wird zum Hochladen von Benutzer -Tags benötigt. Im Moment dreht sich das gesamte Problem um den willkürlichen Zoom der Karte beim Ziehen der Karte.

Top