如何在纯Python实现的Kivy搜索栏中,通过单选按钮返回指定字符串?
解决Kivy中单选按钮返回特定字符串的问题
没问题,这事儿好办!要实现点击搜索按钮时,获取选中的单选按钮对应的过滤字符串,咱们可以给每个CheckBox绑定对应的过滤文本,然后在搜索回调里找到选中的那个就行。下面是修改后的纯Python代码,我会把关键部分标出来:
from kivy.app import App from kivy.uix.screenmanager import Screen, ScreenManager from kivy.uix.boxlayout import BoxLayout from kivy.uix.label import Label from kivy.uix.textinput import TextInput from kivy.uix.button import Button from kivy.uix.checkbox import CheckBox class avbl_bk(Screen): def __init__(self,**kwargs): super(avbl_bk,self).__init__(**kwargs) blayout = BoxLayout(orientation="vertical") check_layout = BoxLayout() # 改名让语义更清晰 search_layout = BoxLayout(spacing=10, padding=5) search_label = Label(text="Search: ", size_hint_x=0.5) self.search_box = TextInput(multiline=False, font_size=40, size_hint_x=0.8) search_btn = Button(text="Search", size_hint=(.3, 0.8)) # 给搜索按钮绑定回调函数 search_btn.bind(on_press=self.on_search_press) filters = ["ISBN", "Book", "Genre", "Author", "Publisher", "Copies"] # 存储所有CheckBox,方便后续查找选中的项 self.filter_checkboxes = [] for filter_text in filters: check_layout.add_widget(Label(text=filter_text)) chk = CheckBox(group='1') # 给每个CheckBox添加自定义属性,存储对应的过滤文本 chk.filter_text = filter_text self.filter_checkboxes.append(chk) check_layout.add_widget(chk) search_layout.add_widget(search_label) search_layout.add_widget(self.search_box) search_layout.add_widget(check_layout) search_layout.add_widget(search_btn) blayout.add_widget(search_layout) self.add_widget(blayout) def on_search_press(self, instance): # 遍历所有CheckBox,找到选中的那个 selected_filter = None for chk in self.filter_checkboxes: if chk.active: selected_filter = chk.filter_text break # 获取搜索框的内容 search_query = self.search_box.text # 这里就是你要执行的搜索逻辑啦,把选中的过滤条件和搜索内容传进去 if selected_filter and search_query: print(f"正在按 {selected_filter} 搜索: {search_query}") # 调用你的搜索函数,比如 self.perform_search(selected_filter, search_query) elif not selected_filter: print("请选择一个过滤条件!") elif not search_query: print("请输入搜索内容!") class MyApp(App): def build(self): sm = ScreenManager() sm.add_widget(avbl_bk(name='avbl_bk')) return sm if __name__ == '__main__': MyApp().run()
关键改动说明:
- 去掉了
eval创建CheckBox的方式,直接在循环里生成,更安全也更易维护 - 给每个
CheckBox添加了自定义属性filter_text,直接对应filters里的字符串,不用再通过索引对应 - 把所有CheckBox存在
self.filter_checkboxes列表里,方便后续遍历查找选中项 - 给搜索按钮绑定了
on_search_press回调函数,在里面获取选中的过滤条件和搜索框内容,你可以把这里的打印换成自己的搜索逻辑 - 给
search_box加了self前缀,这样在回调里能拿到输入的内容
这样点击搜索按钮时,就能准确获取你选中的过滤字符串啦,完全用纯Python实现,不需要kv文件~
内容的提问来源于stack exchange,提问作者Natsuki
相关产品推荐
相关产品推荐

