# Version 0.7
# Author: Miguel Martinez Lopez
# Uncomment the next line to see my email
# print "Email: ", "61706c69636163696f6e616d656469646140676d61696c2e636f6d".decode("hex")
from Tkinter import *
class SimultaneousPanels(PanedWindow):
def __init__(self):
self.collectionOfPanedWindows = {}
def create_widget(self,master, tag= '_default', **kargs):
widget = PanedWindow(master, **kargs)
self.add_widget(widget,tag)
return widget
def add_widget(self, widget, tag):
widget.other_paned_windows = []
if tag in self.collectionOfPanedWindows:
for pwindow in self.collectionOfPanedWindows[tag]:
widget.other_paned_windows.append(pwindow)
pwindow.other_paned_windows.append(widget)
self.collectionOfPanedWindows[tag].append(widget)
else:
self.collectionOfPanedWindows[tag] = [widget]
widget.bindtags( ('SimultaneousPanels',)+ widget.bindtags() )
widget.bind_class('SimultaneousPanels', '<Button-1>', self.sash_mark)
widget.bind_class('SimultaneousPanels', '<B1-Motion>', self.sash_dragto)
def sash_mark(self,event):
this_widget = event.widget
identity = this_widget.identify(event.x, event.y)
if len(identity) ==2:
index = identity[0]
this_widget.activedSash=index
else:
this_widget.activedSash = None
def __debug_pane(self, panedwindow):
for tcl_object in panedwindow.panes():
pane = panedwindow.nametowidget( str( tcl_object ) )
if panedwindow.orient == HORIZONTAL:
print pane.winfo_width(),
else:
print pane.winfo_height(),
print
def sash_dragto(self,event):
this_widget = event.widget
activedSash = this_widget.activedSash
coord_x = event.x
coord_y = event.y
if activedSash != None:
for pwindow in this_widget.other_paned_windows:
pwindow.sash_place(activedSash, coord_x, coord_y)
this_widget.sash_place(activedSash, coord_x, coord_y)
return "break"
def clear(self):
for list_of_panels in self.collectionOfPanedWindows.values():
for panel in list_of_panels:
del panel.other_paned_windows
self.delete_bindtag(panel)
self.collectionOfPanedWindows = {}
def delete_tag(self, tag):
for widget in self.collectionOfPanedWindows[tag]:
del widget.other_paned_windows
self.delete_bindtag(widget)
del self.collectionOfPanedWindows[tag]
def delete_widget(self, widget, tag):
for panel in self.collectionOfPanedWindows[tag]:
panel.other_paned_windows.remove(widget)
self.delete_bindtag(widget)
del widget.other_paned_windows
def delete_bindtag(self, widget):
new_bindtags = list(widget.bindtags())
new_bindtags.remove('SimultaneousPanels')
widget.bindtags(tuple(new_bindtags))
def test():
root = Tk()
connectedPanels = SimultaneousPanels()
Button(root, text="Click here to destroy conexion between panels", command = connectedPanels.clear).pack()
for i in range(3):
emptySpace = Frame(root, height=10)
emptySpace.pack()
m = connectedPanels.create_widget(root, bd=1, orient=VERTICAL,sashwidth=2,sashrelief=RIDGE)
m.pack()
for j in range(3):
panel= Label(m, text="panel number %s" %j)
m.add(panel)
root.mainloop()
if __name__ == '__main__':
test()
Diff to Previous Revision
--- revision 7 2014-06-14 01:43:17
+++ revision 8 2014-06-24 15:34:43
@@ -1,8 +1,7 @@
-# Version 0.6
+# Version 0.7
# Author: Miguel Martinez Lopez
-# Email: Uncomment the next line to see my email
-# print "Author's email: ", "61706c69636163696f6e616d656469646140676d61696c2e636f6d".decode("hex")
-
+# Uncomment the next line to see my email
+# print "Email: ", "61706c69636163696f6e616d656469646140676d61696c2e636f6d".decode("hex")
from Tkinter import *
@@ -45,14 +44,30 @@
else:
this_widget.activedSash = None
+ def __debug_pane(self, panedwindow):
+ for tcl_object in panedwindow.panes():
+ pane = panedwindow.nametowidget( str( tcl_object ) )
+ if panedwindow.orient == HORIZONTAL:
+ print pane.winfo_width(),
+ else:
+ print pane.winfo_height(),
+ print
+
def sash_dragto(self,event):
this_widget = event.widget
activedSash = this_widget.activedSash
-
+
+ coord_x = event.x
+ coord_y = event.y
+
if activedSash != None:
for pwindow in this_widget.other_paned_windows:
- pwindow.sash_place(activedSash, event.x, event.y)
+ pwindow.sash_place(activedSash, coord_x, coord_y)
+ this_widget.sash_place(activedSash, coord_x, coord_y)
+
+ return "break"
+
def clear(self):
for list_of_panels in self.collectionOfPanedWindows.values():
for panel in list_of_panels: