Ruby中TK::Tile::Treeview获取第一列值报错的解决求助
解决Treeview获取#0列时的RuntimeError问题
嘿,这个问题我之前也踩过坑!报错的原因很明确:Treeview里的#0列是内置的默认显示列,它和你后来通过columns参数定义的自定义列(比如action_text)不是一个体系,所以不能用get("#0")这种访问自定义列的方式来获取它的值。
正确的解决方案
要获取#0列的内容,你需要访问Treeview项的text属性,而不是调用get方法。自定义列依然可以用get("列名")正常访问,互不影响。
修改后的完整示例代码
require 'tk' require 'tkextlib/tile' $root = TkRoot.new $frame = Tk::Tile::Frame.new($root) $tree = Tk::Tile::Treeview.new($frame) # 定义自定义列 $tree['columns'] = ['action_text','action_description'] # 设置所有列的标题(包括#0列) $tree.heading('#0', text: '编号') $tree.heading('action_text', text: '操作名称') $tree.heading('action_description', text: '操作说明') # 插入一条测试数据,#0列的内容由text参数指定 test_item = $tree.insert('', 'end', text: '001', values: ['保存数据', '将表单内容写入数据库']) # ❌ 错误写法:会触发RuntimeError: Display column #0 cannot be set # puts $tree.item(test_item).get("#0") # ✅ 正确写法1:通过哈希键获取#0列内容 puts "编号(#0列):#{$tree.item(test_item)['text']}" # ✅ 正确写法2:直接调用text属性 puts "编号(#0列):#{$tree.item(test_item).text}" # 自定义列依然可以用get方法正常获取 puts "操作名称:#{$tree.item(test_item).get('action_text')}" puts "操作说明:#{$tree.item(test_item).get('action_description')}" $frame.pack(padx: 10, pady: 10) $tree.pack(fill: :both, expand: true) Tk.mainloop
关键知识点总结
#0列是Treeview的默认文本列,不属于你自定义的列集合,它的内容是在插入项时通过text参数设置的- 获取
#0列内容:使用item['text']或item.text - 自定义列(如
action_text):继续使用item.get("列名")即可
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

