You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pythonista 3中创建自动补全TextField?

在Pythonista 3中实现带自动补全的TextField

嘿,我完全懂这种对着UI代码摸不着头脑的感觉!既然你已经有Pythonista的使用经验,那咱们一步步来搭建这个自动补全输入框,其实拆解开来每一步都很清晰~

核心思路

咱们需要三个关键部分:

  • 一个ui.TextField用来接收用户输入
  • 一个ui.TableView用来显示过滤后的候选列表(默认隐藏,输入时显示)
  • 借助Delegate机制监听输入变化和列表选择事件

完整实现代码

下面是可直接运行的示例代码,我加了详细注释,你可以直接复制到Pythonista里测试:

import ui

class AutoCompleteTextFieldView(ui.View):
    def __init__(self, candidates, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 候选值数组(可以替换成你自己的内容)
        self.candidates = candidates
        # 初始化UI组件
        self.setup_ui()
        
    def setup_ui(self):
        # 设置主视图背景色
        self.background_color = 'white'
        
        # 1. 创建输入框
        self.text_field = ui.TextField()
        self.text_field.frame = (20, 20, self.width - 40, 40)
        self.text_field.border_style = ui.BORDER_ROUNDED
        # 设置输入框的delegate,用来监听输入变化
        self.text_field.delegate = self
        self.add_subview(self.text_field)
        
        # 2. 创建候选列表(默认隐藏)
        self.table_view = ui.TableView()
        self.table_view.frame = (20, 65, self.width - 40, 200)
        self.table_view.hidden = True
        self.table_view.data_source = self
        self.table_view.delegate = self
        self.add_subview(self.table_view)
        
        # 3. 点击空白处隐藏列表
        self.touch_enabled = True
        
    def textfield_did_change(self, textfield):
        # 当输入框内容变化时触发
        input_text = textfield.text.lower()
        # 过滤候选数组(不区分大小写)
        filtered_candidates = [item for item in self.candidates if input_text in item.lower()]
        
        if filtered_candidates and input_text:
            # 更新列表数据
            self.filtered_candidates = filtered_candidates
            self.table_view.reload()
            self.table_view.hidden = False
        else:
            # 没有匹配项或输入为空时隐藏列表
            self.table_view.hidden = True
            
    def tableview_number_of_rows(self, tableview, section):
        # 返回列表行数
        return len(getattr(self, 'filtered_candidates', []))
    
    def tableview_cell_for_row(self, tableview, section, row):
        # 创建列表单元格
        cell = ui.TableViewCell()
        cell.text_label.text = self.filtered_candidates[row]
        return cell
    
    def tableview_did_select(self, tableview, section, row):
        # 选中列表项时,把内容填入输入框
        selected_item = self.filtered_candidates[row]
        self.text_field.text = selected_item
        # 隐藏列表
        self.table_view.hidden = True
        # 取消列表选中状态
        tableview.selected_row = (-1, -1)
        
    def touch_began(self, touch):
        # 点击空白处隐藏列表
        self.table_view.hidden = True

# 测试用的候选数组
test_candidates = [
    'Apple', 'Banana', 'Cherry', 'Date', 'Elderberry',
    'Fig', 'Grape', 'Honeydew', 'Kiwi', 'Lemon'
]

# 创建并显示视图
if __name__ == '__main__':
    view = AutoCompleteTextFieldView(test_candidates)
    view.present('sheet')

关键部分解释

  • Delegate机制:这里我们让主视图同时充当TextField和TableView的delegate,这样就能监听输入变化(textfield_did_change)和列表选择(tableview_did_select)事件,这是Pythonista UI里处理交互的核心方式。
  • 列表显示逻辑:输入内容时,我们实时过滤候选数组,只有当有匹配项且输入不为空时才显示列表,否则隐藏。
  • 交互细节:点击空白处或选中列表项后自动隐藏列表,提升用户体验。

自定义扩展建议

  • 你可以把test_candidates替换成自己需要的候选数组,比如文件路径、关键词列表等。
  • 可以调整过滤逻辑,比如只匹配开头而不是包含,只需要把input_text in item.lower()改成item.lower().startswith(input_text)。
  • 还可以调整列表的大小、位置,或者给单元格加样式,让它更符合你的需求。

内容的提问来源于stack exchange,提问作者SavinI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:34:59