Welcome, guest | Sign In | My Account | Store | Cart
# 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:

History