2013-12-11 22 views
2

當查詢(Python)ttk.Treeviewitemopen選項時,我遇到不利行爲。一個節點(item)的知名度可以通過做類似設置:檢索ttk.Treeview項目的「打開」選項作爲布爾值

tree.item(someItemID, open=True) # or 
tree.item(someItemID, open=False) 

而且我的假設是open選項可以查詢得到一個布爾真/假。但是,這似乎並非如此。考慮這個腳本:

from Tkinter import * 
from ttk import Treeview 

def check_state(): 
    for row in tree.get_children(): 
     opened = tree.item(row, option='open') 
     print row, 'opened:', opened, '(type: %s)' % str(type(opened)), 'Got:', 
     if not opened: 
      print 'False (bool)' 
     elif opened == 'true': 
      print 'equal to string "true"' 
     elif opened == 'false': 
      print 'equal to string "false"' 
     elif opened: 
      print 'True (bool)' 
     else: 
      print 'something entirely different(!)' 
    print 

win = Frame() 
tree = Treeview(win) 
win.pack() 
tree.pack() 
Button(win, text='View state', command=check_state).pack() 


level1 = ['C:\\dir1', 'C:\\dir2', 'C:\\dir3'] 
level2 = ['one.txt', 'two.txt', 'three.txt'] 
for L in level1: 
    iid = tree.insert('', END, text=L) 
    for M in level2: 
     tree.insert(iid, END, text=M) 

win.mainloop() 

運行時,它顯示一個小的Treeview控件,填充了僞目錄和文件名。 之前打開或關閉任何頂級節點,按下按鈕轉儲open選項狀態到標準輸出。應該是這樣的:

I001 opened: 0 (type: <type 'int'>) Got: False (bool) 
I005 opened: 0 (type: <type 'int'>) Got: False (bool) 
I009 opened: 0 (type: <type 'int'>) Got: False (bool) 

現在打開其中一個節點上,再次按下按鈕。現在它傾倒:

I001 opened: 0 (type: <type 'int'>) Got: False (bool) 
I005 opened: 0 (type: <type 'int'>) Got: False (bool) 
I009 opened: true (type: <type '_tkinter.Tcl_Obj'>) Got: True (bool) 

最後,關閉所有節點並再次按下按鈕。它轉儲:

I001 opened: 0 (type: <type 'int'>) Got: False (bool) 
I005 opened: 0 (type: <type 'int'>) Got: False (bool) 
I009 opened: false (type: <type '_tkinter.Tcl_Obj'>) Got: True (bool) 

脫穎而出,以我的事情:

  1. 不一致:當初始化爲int S,後來分配的值是_tkinter對象
  2. 布爾比較失敗:儘管_tkinter對象渲染作爲字符串「真」或「假」,他們不計算
真與假(打印爲「假」評估爲真例如 _tkinter對象)

任何人都知道給出了什麼?我如何可靠地確定Treeview項目的打開/關閉狀態?

回答

0

有一個Tkinter的選項:tkinter.wantObjects,有些人主動提出更改爲False。它應該讓Tk不使用TCL_objs。但是當我嘗試它時,TreeView看起來破碎了。

作爲一種變通方法我用BooleanVar的方式是這樣的:

open_opt = BooleanVar() 
for row in tree.get_children(): 
    open_opt.set(str(tree.item(row, option='open'))) 
    opened = open_opt.get() 

這種方式似乎工作,我

1

在琳達當然巴倫週刊石,Python的GUI開發與Tkinter的,一節課視頻, Building a hierarchical treeview,有一個例子說明如何獲得「是開放的?」結果。我已經修改了下面的例子:

的Python 3.5在IDLE控制檯

>>> from tkinter import * 
>>> from tkinter import ttk 
>>> root = Tk() 
>>> treeview = ttk.Treeview(root) 
>>> treeview.pack() 
>>> treeview.insert('', '0', 'par1', text = 'Parent') 
'par1' 
>>> treeview.insert('par1', '0', 'child1', text = 'Child') 
'child1' 
>>> treeview.item('par1', 'open') 
0 
>>> treeview.item('par1', open = True) 
{} 
>>> treeview.item('par1', 'open') 
1 
>>> 

並不是布爾值的要求,而是一個int是一樣好。