handle_delete-method ist never invoked in an ui.View #92
Replies: 2 comments 2 replies
-
|
Pythonista doc for ListDataSource describes attribute edit_action called when row is deleted, never seen "your" delete_action. |
Beta Was this translation helpful? Give feedback.
-
|
I have asked Grok to comment on this issue. Here is the response: Comment on GitHub Discussion #92The core issue here is a mismatch between the code and Pythonista's Additionally:
Here's the fixed code snippet for your import ui
class FotoBrowser(ui.View):
def __init__(self):
super().__init__()
self.frame = (0, 0, 600, 400)
self.background_color = "white"
# Left area for filenames
self.table_view = ui.TableView(frame=(0, 0, 200, 400))
self.add_subview(self.table_view)
# Right area for photos
self.iv = ui.ImageView(frame=(210, 0, 380, 400))
self.iv.content_mode = ui.CONTENT_SCALE_ASPECT_FIT
self.iv.background_color = "white"
self.iv.current_id = None
self.add_subview(self.iv)
# DataSource setup
self.bilder = [] # Store full data here
self.ds = ui.ListDataSource([])
self.ds.delete_enabled = True
self.ds.action = self.did_select
self.ds.edit_action = self.handle_delete # Fixed: use edit_action
self.table_view.data_source = self.ds
self.table_view.delegate = self.ds
# Initial load
self.reload_list()
def reload_list(self):
self.bilder = lade_bilder_aus_db() # Assuming this returns list of (id_, name) tuples
self.ds.items = [f"ID {id_}: {name}" for (id_, name) in self.bilder]
self.table_view.reload()
def did_select(self, sender):
print("did_select")
row = sender.selected_row
if row < 0:
return
foto_id, _ = self.bilder[row]
blob = lade_blob_aus_db(foto_id)
if blob:
self.iv.image = blob_to_ui_image(blob)
self.iv.current_id = foto_id
else:
self.iv.image = None
self.iv.current_id = None
def handle_delete(self, datasource): # Fixed: only 'datasource' arg
print("handle_delete")
# Detect deleted item by comparing old vs. new items
old_items = [f"ID {id_}: {name}" for (id_, name) in self.bilder] # Reconstruct expected old list
new_items = datasource.items
# Find the missing item (assumes single delete; for multi, adapt accordingly)
deleted_item = next((item for item in old_items if item not in new_items), None)
if deleted_item:
# Parse ID from string (e.g., "ID 123: filename.jpg" -> 123)
foto_id = int(deleted_item.split(':')[0].split()[-1])
# Clear image if showing deleted foto
if self.iv.current_id == foto_id:
self.iv.image = None
self.iv.current_id = None
# Delete from DB
loesche_datensatz(foto_id)
# Reload to sync everything
self.reload_list()
# Start
if __name__ == "__main__":
browser = FotoBrowser()
browser.present("sheet")Quick Explanation
This should resolve it—drop this as a reply on the thread! If multi-row edits are needed, let me know for tweaks. |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
Hello community,
I‘am trying to create an application that allows me to retrieve a set of photos from an sqlite3-database and should give me the possibility to delete an entry via the handle_delete()-Method. The photos are retrieved and shown in the table_view, the delete_button is shown in the table_view but unfortunately the handle_delete()-method ist never invoked.
Any ideas about that?
Thanks in advance
class FotoBrowser(ui.View):
def init(self):
super().init()
self.frame = (0, 0, 600, 400)
self.background_color = "white"
------------------- Start -------------------
if name == "main":
browser = FotoBrowser()
#print(ui.ListDataSource.str)
browser.present("sheet")
Beta Was this translation helpful? Give feedback.
All reactions