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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:27:24