KivyMD实现点击删除按钮删除文件对应行并刷新界面的方法
KivyMD实现点击删除按钮删除文件对应行并刷新界面的方法
嘿,我来帮你搞定这个删除功能!其实核心就是给删除按钮绑定点击事件,处理文件的修改,然后重新加载界面就行。我给你调整后的代码,关键修改都加了注释,一看就懂:
from kivy.lang import Builder from kivy.uix.screenmanager import ScreenManager, Screen from kivy.core.window import Window Window.keyboard_anim_args = {'d': .2, 't': 'in_out_expo'} Window.softinput_mode = "below_target" Window.size = (450,800) from kivymd.app import MDApp from kivymd.uix.menu import MDDropdownMenu from kivymd.uix.navigationbar import MDNavigationBar, MDNavigationItem from kivymd.uix.boxlayout import MDBoxLayout from kivymd.uix.label import MDLabel from kivymd.uix.divider import MDDivider from kivymd.uix.button import MDButton, MDButtonText, MDButtonIcon from kivymd.uix.textfield import MDTextField import os KV = ''' <MainScreen>: MDScreen: md_bg_color: app.theme_cls.backgroundColor <FavoritenScreen>: MDScreen: ScrollView: id: favoriten_sv size_hint: None, None size: root.width, root.height pos_hint: {'center_x': 0.5, 'center_y': 0.3} MDBoxLayout: id: favoriten_layout orientation: 'vertical' size_hint_y: None height: self.minimum_height MDBoxLayout: orientation: "vertical" ScreenManager: id:sm MainScreen: name: 'Suche' FavoritenScreen: name: 'Favoriten' MDNavigationBar: on_switch_tabs: app.wechsel(*args) MDNavigationItem: MDNavigationItemIcon: icon:'text-search' MDNavigationItemLabel: text:'Suche' MDNavigationItem: MDNavigationItemIcon: icon:'heart' MDNavigationItemLabel: text:'Favoriten' ''' class FavoritenScreen(Screen): def on_enter(self): self.ids.favoriten_layout.clear_widgets() fav = self.manager.get_screen('Suche').favoriten_laden() for entry in range(len(fav)): if fav[entry].strip(): if entry > 0: e = fav[entry].split(';') button_layout = MDBoxLayout(orientation='horizontal',size_hint_y=None,height=126) favorite_label = MDTextField( text=e[1] + '\n' + e[0] + '\n' + e[2] + '\n' + e[3], disabled=True, multiline=True, #halign="center", ) favorite_button = MDButton( pos_hint={'center_y': 0.45} ) favorite_button.add_widget(MDButtonIcon( icon='check' )) delete_button = MDButton( pos_hint={'center_y': 0.45}, # 绑定删除事件,把当前要删除的行传递给方法 on_release=lambda x, line=fav[entry]: self.delete_entry(line) ) delete_button.add_widget(MDButtonIcon( icon='delete' )) button_layout.add_widget(favorite_label) button_layout.add_widget(favorite_button) button_layout.add_widget(delete_button) self.ids.favoriten_layout.add_widget(button_layout) def delete_entry(self, line_to_delete): # 读取文件所有行 with open('f', 'r', encoding='utf-8') as r: lines = r.readlines() # 过滤掉要删除的行,保留表头和其他有效行 new_lines = [line for line in lines if line.strip() != line_to_delete.strip()] # 将更新后的内容写回文件 with open('f', 'w', encoding='utf-8') as w: w.writelines(new_lines) # 重新加载界面,刷新收藏列表 self.on_enter() class MainScreen(Screen): def __init__(self, **kwargs): super().__init__(**kwargs) self.fav = self.favoriten_laden() def favoriten_laden(self): if not os.path.exists('f'): with open('f', 'w', encoding='utf-8') as w: w.write('stadt;marke;adresse;kraftstoff\n') # 加换行避免表头和内容连在一起 with open('f', 'r', encoding='utf-8') as r: fav = r.read() return fav.split('\n') class MyApp(MDApp): def wechsel(self, bar: MDNavigationBar, item: MDNavigationItem, item_icon: str, item_text: str): if item_text == 'Suche': self.root.ids.sm.transition.direction = 'right' elif item_text == 'Favoriten': self.root.ids.sm.transition.direction = 'left' self.root.ids.sm.current = item_text def build(self): self.title = 'Test' self.theme_cls.theme_style = 'Dark' self.theme_cls.primary_palette = 'Whitesmoke' self.screen = Builder.load_string(KV) return self.screen if __name__ == '__main__': MyApp().run()
关键修改说明:
给删除按钮绑定点击事件:
在创建delete_button时,通过lambda把当前要删除的行(fav[entry])传递给delete_entry方法,这样点击按钮时就明确知道要删哪一行了。实现删除逻辑:
新增的delete_entry方法会:- 读取文件里的所有行
- 过滤掉要删除的行(用
strip()去掉换行和空格,确保匹配准确) - 把更新后的内容重新写入文件
- 调用
on_enter()重新加载界面,这样就能立刻看到最新的收藏列表
小优化:
在MainScreen的favoriten_laden方法里,创建文件时给表头加了个换行符,避免表头和第一行内容连在一起导致显示异常。
现在你运行代码试试,点击删除按钮后,对应的行就会从文件里消失,界面也会自动刷新啦!
备注:内容来源于stack exchange,提问作者jigga
相关产品推荐
相关产品推荐

