Как вызвать разные функции для разных элементов wx.TreeCtrl в wx python? - PullRequest
0 голосов
/ 18 января 2020

Как вызвать разные функции для разных элементов wx.TreeCtrl. когда я вызываю Fun_ASTER во втором элементе дерева, он возвращает последнее значение из элемента USGS (первый элемент в дереве).

    root = self.tree.AddRoot('Spectral Database')
    files = []
    self.dname = []
    self.test = []

    self.tree.AppendItem(root, 'USGS')
    for dirname, dirnames, filenames in os.walk('.\USGS'):
            for filename in filenames:
                files.append(os.path.join(dirname, filename))
                self.test.append(filename)
                self.tree.AppendItem(self.tree.GetLastChild(root), filename)
            self.dname = files[:]                
    self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.Fun_USGS, self.tree)

    self.tree.AppendItem(root,'ASTER')
    for dirname, dirnames, filenames in os.walk('.\ASTER'):
            for filename in filenames:
                files.append(os.path.join(dirname, filename))
                self.tree.AppendItem(self.tree.GetLastChild(root), filename)
            self.dname = files[:]
    self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.Fun_ASTER, self.tree)

1 Ответ

0 голосов
/ 19 января 2020

Если вы создадите закодированный пример, который могут запускать люди, вместо того, чтобы вырезать и вставлять частичные фрагменты кода, больше людей ответят на ваш вопрос.
Мало кто захочет догадаться о пропущенных фрагментах кода.

Упрощение ответа на ваш вопрос.

Вы связываете одно событие с 2 функциями, поэтому любая функция, с которой вы связали событие, будет выполняться. Вы можете сделать эту функцию, посмотреть на выбранный элемент и принять решение о том, что с ним делать, или одна из деталей самого объекта события может решить за вас.

В любом случае, вот код, который поможет вам на вашем пути.

import wx
import os

class MyFrame(wx.Frame):
    def __init__(self, parent, id=wx.ID_ANY, title="", size=(660,300)):
        super(MyFrame, self).__init__(parent, id, title, size)
        self.panel = wx.Panel(self)

        self.tree = wx.TreeCtrl(self.panel, id=wx.ID_ANY, pos=wx.DefaultPosition, size=(600,300),
             style=wx.TR_DEFAULT_STYLE, validator=wx.DefaultValidator)
        root = self.tree.AddRoot('Spectral Database')
        files = []
        self.dname = []
        self.test = []

        self.tree.AppendItem(root, 'USGS')
        for dirname, dirnames, filenames in os.walk('./image'):
                for filename in filenames:
                    files.append(os.path.join(dirname, filename))
                    self.test.append(filename)
                    self.tree.AppendItem(self.tree.GetLastChild(root), filename)
                self.dname = files[:]

        self.tree.AppendItem(root,'ASTER')
        for dirname, dirnames, filenames in os.walk('./image2'):
                for filename in filenames:
                    files.append(os.path.join(dirname, filename))
                    self.tree.AppendItem(self.tree.GetLastChild(root), filename)
                self.dname = files[:]

        self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.Fun_Selected, self.tree)

        self.Show()

    def Fun_Selected(self, event):
        self.item = event.GetItem()
        if self.item:
            print("Selected: %s\n" % self.tree.GetItemText(self.item))

if __name__ == "__main__":
    app = wx.App()
    frame = MyFrame(None,title="The Main Frame")
    app.MainLoop()

enter image description here

...