Browse Source

Only create popup menus on demand to avoid Tcl menu allocation error

Mark Mine 22 years ago
parent
commit
1fc1a5100f
2 changed files with 26 additions and 16 deletions
  1. 2 0
      direct/src/tkpanels/DirectSessionPanel.py
  2. 24 16
      direct/src/tkwidgets/Tree.py

+ 2 - 0
direct/src/tkpanels/DirectSessionPanel.py

@@ -1003,3 +1003,5 @@ class DirectSessionPanel(AppShell):
         # Remove hooks
         for event, method in self.actionEvents:
             self.ignore(event)
+        # Destroy SGE hierarchy
+        self.SGE._node.destroy()

+ 24 - 16
direct/src/tkwidgets/Tree.py

@@ -41,26 +41,17 @@ class TreeNode:
         self.x = self.y = None
         self.iconimages = {} # cache of PhotoImage instances for icons
         self.menuList = menuList
-        self.menuVar = IntVar()
-        self.menuVar.set(0)
-        self._popupMenu = None
         if self.menuList:
             if self.menuList[-1] == 'Separator':
                 self.menuList = self.menuList[:-1]
-            self._popupMenu = Menu(self.canvas, tearoff = 0)
-            for i in range(len(self.menuList)):
-                item = self.menuList[i]
-                if item == 'Separator':
-                    self._popupMenu.add_separator()
-                else:
-                    self._popupMenu.add_radiobutton(
-                        label = item,
-                        variable = self.menuVar,
-                        value = i,
-                        indicatoron = 0,
-                        command = self.popupMenuCommand)
-                    
+        self.menuVar = IntVar()
+        self.menuVar.set(0)
+        self._popupMenu = None
+
     def destroy(self):
+        if self._popupMenu:
+            print 'kill it'
+            self._popupMenu.destroy()
         for key in self.kidKeys:
             c = self.children[key]
             del self.children[key]
@@ -118,7 +109,24 @@ class TreeNode:
         self.item.OnDoubleClick()
         return "break"
 
+    def createPopupMenu(self):
+        if self.menuList:
+            self._popupMenu = Menu(self.canvas, tearoff = 0)
+            for i in range(len(self.menuList)):
+                item = self.menuList[i]
+                if item == 'Separator':
+                    self._popupMenu.add_separator()
+                else:
+                    self._popupMenu.add_radiobutton(
+                        label = item,
+                        variable = self.menuVar,
+                        value = i,
+                        indicatoron = 0,
+                        command = self.popupMenuCommand)
+                    
     def popupMenu(self, event=None):
+        if not self._popupMenu:
+            self.createPopupMenu()
         if self._popupMenu:
             self._popupMenu.post(event.widget.winfo_pointerx(),
                                  event.widget.winfo_pointery())