wxPython TreeCtrl: получение данных элемента дерева по индексу
Как получить данные элемента дерева по индексу дерева?
В настоящее время я пишу графический интерфейс с помощью wxPython (используя Python 2.7). Этот графический интерфейс содержит CustomTreeCtrl, который построен следующим образом:
# Create Tree control
widget_tree = CustomTreeCtrl(parent=self, id=ID_WIDGET_TREE, agwStyle=wx.TR_HIDE_ROOT | wx.TR_SINGLE | wx.TR_HAS_BUTTONS,
size=(UI_tree_width, -1))
widget_tree.SetBackgroundColour(wx.WHITE)
root = widget_tree.AddRoot(text="root")
# Create general
item_general = widget_tree.AppendItem(parentId=root, text='General')
item_main = widget_tree.AppendItem(parentId=item_general, text='Main', data={'tooltip': 'Main'})
widget_tree.AppendItem(parentId=item_general, text='Manual', data={'tooltip': 'Manual'})
widget_tree.AppendItem(parentId=item_general, text='Boundary conditions', data={'tooltip': 'BC'})
# Create stiffeners
item_stiffener = widget_tree.AppendItem(parentId=root, text='Stiffeners')
widget_tree.AppendItem(parentId=item_stiffener, text='Stiffener 1', data={'tooltip': 'Stiffener 1'})
widget_tree.AppendItem(parentId=item_stiffener, text='Stiffener 2', data={'tooltip': 'Stiffener 2'})
widget_tree.AppendItem(parentId=item_stiffener, text='Add stiffener', data={'tooltip': 'Creates a new stiffener'})
Данные будут расширены с определенным вводом пользователем. Кроме того, нажав "Добавить элемент жесткости", вы добавите элемент над "Добавить элемент жесткости". Для целей инструмента мне нужно получить эти данные от каждого ребра жесткости. Мне было интересно, можно ли назвать эти списки одинаковыми в списках. Так, например, я мог бы вызвать widget_tree.GetTreeItem[0][1][0] для [root][ребра жесткости] [ребра жесткости 1] и так далее.
Я долго искал и надеялся, что кто-нибудь сможет мне помочь. Заранее спасибо!
1 ответ
Я унаследовал проект, который имел чрезвычайно сложный способ сделать то, что вы просите, но ваш пост дал мне новую идею. Концептуально, я думаю, что вы говорите о чем-то похожем на get_item_by_indexes
метод в этом примере (я оставил во всех отладочных отпечатках):
import wx
from wx.lib.agw.customtreectrl import CustomTreeCtrl
class IndexTree(CustomTreeCtrl):
def get_item_by_indexes(self, *args):
args = list(args) # copy so we don't modify original
print("Trying tree index: %s" % str(args))
if args[0] > 0:
raise IndexError("Invalid root index")
parent = self.GetRootItem()
print("arg_index=0, tree_index=0, item=%s" % (parent.GetText()))
for arg_index, tree_index in enumerate(args[1:], 1):
parent = parent.GetChildren()[tree_index]
print("arg_index=%d, tree_index=%d, item=%s" % (arg_index, tree_index, parent.GetText()))
return parent
class MyFrame(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.DefaultSize)
widget_tree = IndexTree(parent=self, agwStyle=wx.TR_HIDE_ROOT | wx.TR_SINGLE | wx.TR_HAS_BUTTONS,
size=(400, -1))
widget_tree.SetBackgroundColour(wx.WHITE)
root = widget_tree.AddRoot(text="root")
# Create general
item_general = widget_tree.AppendItem(parentId=root, text='General')
item_main = widget_tree.AppendItem(parentId=item_general, text='Main', data={'tooltip': 'Main'})
widget_tree.AppendItem(parentId=item_general, text='Manual', data={'tooltip': 'Manual'})
widget_tree.AppendItem(parentId=item_general, text='Boundary conditions', data={'tooltip': 'BC'})
# Create stiffeners
item_stiffener = widget_tree.AppendItem(parentId=root, text='Stiffeners')
widget_tree.AppendItem(parentId=item_stiffener, text='Stiffener 1', data={'tooltip': 'Stiffener 1'})
widget_tree.AppendItem(parentId=item_stiffener, text='Stiffener 2', data={'tooltip': 'Stiffener 2'})
widget_tree.AppendItem(parentId=item_stiffener, text='Add stiffener', data={'tooltip': 'Creates a new stiffener'})
widget_tree.get_item_by_indexes(0)
widget_tree.get_item_by_indexes(0, 1)
widget_tree.get_item_by_indexes(0, 0, 0)
widget_tree.get_item_by_indexes(0, 1, 0)
widget_tree.get_item_by_indexes(0, 1, 2)
try:
widget_tree.get_item_by_indexes(0, 1, 8)
except IndexError, e:
print(e)
class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, 'IndexTree')
frame.Show(True)
frame.Centre()
return True
if __name__ == '__main__':
app = MyApp(0)
app.MainLoop()
который для тестовых случаев выдает:
Trying tree index: [0]
arg_index=0, tree_index=0, item=root
Trying tree index: [0, 1]
arg_index=0, tree_index=0, item=root
arg_index=1, tree_index=1, item=Stiffeners
Trying tree index: [0, 0, 0]
arg_index=0, tree_index=0, item=root
arg_index=1, tree_index=0, item=General
arg_index=2, tree_index=0, item=Main
Trying tree index: [0, 1, 0]
arg_index=0, tree_index=0, item=root
arg_index=1, tree_index=1, item=Stiffeners
arg_index=2, tree_index=0, item=Stiffener 1
Trying tree index: [0, 1, 2]
arg_index=0, tree_index=0, item=root
arg_index=1, tree_index=1, item=Stiffeners
arg_index=2, tree_index=2, item=Add stiffener
Trying tree index: [0, 1, 8]
arg_index=0, tree_index=0, item=root
arg_index=1, tree_index=1, item=Stiffeners
list index out of range
Большое предостережение, что я еще не использовал это на практике, потому что у меня не было идеи до того, как я увидел ваш пост только сейчас. Но я взломал это вместе, и мне интересно посмотреть, смогу ли я заменить слишком сложный метод моего проекта.