Welcome, guest | Sign In | My Account | Store | Cart
# Author: Miguel Martinez Lopez

try:
    from Tkinter import Label, Frame, LabelFrame, Checkbutton, Radiobutton, PanedWindow
    from Tkconstants import *
except ImportError:
    from tkinter import Label, Frame, LabelFrame, Checkbutton, Radiobutton, PanedWindow
    from tkinter.constants import *
    
class ColoredArea(object):
    def make_label(self, **kw):
        kw.setdefault("background", self._background)
        return Label(self, **kw)

    def make_labelframe(self, **kw):
        kw.setdefault("background", self._background)
        return Colored_LabelFrame(self, **kw)

    def make_frame(self, **kw):
        kw.setdefault("background", self._background)
        return Colored_Frame(self, **kw)

    def make_radiobutton(self, **kw):
        kw.setdefault("background", self._background)
        return Radiobutton(self, **kw)
        
    def make_checkbutton(self, **kw):
        kw.setdefault("background", self._background)
        return Checkbutton(self, **kw)
        
    def make_panedwindow(self, **kw):
        kw.setdefault("background", self._background)
        return PanedWindow(self, **kw)

class Colored_Frame(Frame, ColoredArea):        
    def __init__(self, master=None, **kw):
        if "background" in kw:
            self._background = kw["background"]
        else:
            raise Exception("No background color")

        Frame.__init__(self, master, **kw)
        
class Colored_LabelFrame(LabelFrame, ColoredArea):        
    def __init__(self, master=None, **kw):
        if "background" in kw:
            self._background = kw["background"]
        else:
            raise Exception("No background color")

        LabelFrame.__init__(self, master, **kw)

class QuoteFrame(Frame):
    CONTENT_BACKGROUND = "#eeeeee"
    CONTENT_PADDING = 10
    LEFT_BORDER_COLOR = "#555555"
    LEFT_BORDER_WIDTH = 6

    def __init__(self,master=None, **kw):
        Frame.__init__(self, master, background = self.CONTENT_BACKGROUND)
        Frame(self, background=self.LEFT_BORDER_COLOR, width=self.LEFT_BORDER_WIDTH).pack(side=LEFT, fill=Y)
    
        self.body = Colored_Frame(self, background = self.CONTENT_BACKGROUND, padx=self.CONTENT_PADDING, pady=self.CONTENT_PADDING)
        self.body.pack(expand=True, fill=BOTH)

class Metro_LabelFrame(Frame):
    HEADER_BACKGROUND = "#1ba1e2"
    HEADER_FOREGROUND = "white"
    CONTENT_BACKGROUND = "#e8f1f4"
    INNER_PADDING = 8
    
    FONT_HEADER = "TkDefaultFont"
    #("Segoe UI", "Open Sans", "sans-serif", "serif")

    def __init__(self, master, title):
        Frame.__init__(self, master)
        
        header = Frame(self, background=self.HEADER_BACKGROUND, padx=self.INNER_PADDING, pady= self.INNER_PADDING)
        header.pack(expand=True, fill=X)
        
        self._title = title
        self._title_label = Label(header, text=title, foreground=self.HEADER_FOREGROUND, background=self.HEADER_BACKGROUND, font=self.FONT_HEADER)
        self._title_label.pack(anchor=W)
        
        self.body = Colored_Frame(self, padx=self.INNER_PADDING, pady= self.INNER_PADDING, background = self.CONTENT_BACKGROUND)
        self.body.pack(expand=True, fill=BOTH)
        
    @property
    def title(self):
        return self._title

    @title.setter
    def title(self, title):
        self._title = title
        self._title_label.configure(text=title)

if __name__ == "__main__":
    
    try:
        from Tkinter import Tk
    except ImportError:
        from tkinter import Tk
        
    root = Tk()

    row = Frame(root)
    row.pack()
    for i in range(4):
        metro_labelframe = Metro_LabelFrame(row, title="This is the title")
        metro_labelframe.pack(side=LEFT, padx=6, pady=9)
        for i  in range(5):
            metro_labelframe.body.make_label(text="This is line number %i"%i).pack(expand=True, fill=BOTH)
    
    row = Frame(root)
    row.pack()
    
    metro_labelframe = Metro_LabelFrame(row, title="This is the title")
    metro_labelframe.pack(side=LEFT, padx=6, pady=9)
    
    metro_labelframe.body.make_label(text="One line").pack(anchor=W)
    metro_labelframe.body.make_label(text="Another line").pack(anchor=W)
    metro_labelframe.body.make_label(text="more lines...").pack(anchor=W)
    quote = QuoteFrame(metro_labelframe.body)
    quote.pack()

    quote.body.make_label(text = "blah.. blah..blah..blah..blah..blah..").pack()

    metro_labelframe.body.make_label(text="more body here...").pack(anchor=W)
    root.mainloop()

Diff to Previous Revision

--- revision 1 2016-12-10 02:40:28
+++ revision 2 2017-04-01 19:57:17
@@ -1,5 +1,4 @@
-# encoding: utf-8
-# Author: Miguel Martínez López
+# Author: Miguel Martinez Lopez
 
 try:
     from Tkinter import Label, Frame, LabelFrame, Checkbutton, Radiobutton, PanedWindow
@@ -8,7 +7,32 @@
     from tkinter import Label, Frame, LabelFrame, Checkbutton, Radiobutton, PanedWindow
     from tkinter.constants import *
     
-class ColoredArea(Frame):
+class ColoredArea(object):
+    def make_label(self, **kw):
+        kw.setdefault("background", self._background)
+        return Label(self, **kw)
+
+    def make_labelframe(self, **kw):
+        kw.setdefault("background", self._background)
+        return Colored_LabelFrame(self, **kw)
+
+    def make_frame(self, **kw):
+        kw.setdefault("background", self._background)
+        return Colored_Frame(self, **kw)
+
+    def make_radiobutton(self, **kw):
+        kw.setdefault("background", self._background)
+        return Radiobutton(self, **kw)
+        
+    def make_checkbutton(self, **kw):
+        kw.setdefault("background", self._background)
+        return Checkbutton(self, **kw)
+        
+    def make_panedwindow(self, **kw):
+        kw.setdefault("background", self._background)
+        return PanedWindow(self, **kw)
+
+class Colored_Frame(Frame, ColoredArea):        
     def __init__(self, master=None, **kw):
         if "background" in kw:
             self._background = kw["background"]
@@ -16,48 +40,15 @@
             raise Exception("No background color")
 
         Frame.__init__(self, master, **kw)
+        
+class Colored_LabelFrame(LabelFrame, ColoredArea):        
+    def __init__(self, master=None, **kw):
+        if "background" in kw:
+            self._background = kw["background"]
+        else:
+            raise Exception("No background color")
 
-    def make_label(self, master=None, **kw):
-        if master is None:
-            master = self
-            
-        kw.setdefault("background", self._background)
-        return Label(master, **kw)
-
-    def make_LabelFrame(self, master=None, **kw):
-        if master is None:
-            master = self
-            
-        kw.setdefault("background", self._background)
-        return LabelFrame(master, **kw)
-
-    def make_frame(self, master=None, **kw):
-        if master is None:
-            master = self
-            
-        kw.setdefault("background", self._background)
-        return Frame(master, **kw)
-        
-    def make_radiobutton(self, master=None, **kw):
-        if master is None:
-            master = self
-            
-        kw.setdefault("background", self._background)
-        return Radiobutton(master, **kw)
-        
-    def make_checkbutton(self, master=None, **kw):
-        if master is None:
-            master = self
-            
-        kw.setdefault("background", self._background)
-        return Checkbutton(master, **kw)
-        
-    def make_PanedWindow(self, master=None, **kw):
-        if master is None:
-            master = self
-            
-        kw.setdefault("background", self._background)
-        return PanedWindow(master, **kw)
+        LabelFrame.__init__(self, master, **kw)
 
 class QuoteFrame(Frame):
     CONTENT_BACKGROUND = "#eeeeee"
@@ -69,8 +60,8 @@
         Frame.__init__(self, master, background = self.CONTENT_BACKGROUND)
         Frame(self, background=self.LEFT_BORDER_COLOR, width=self.LEFT_BORDER_WIDTH).pack(side=LEFT, fill=Y)
     
-        self.content = ColoredArea(self, background = self.CONTENT_BACKGROUND, padx=self.CONTENT_PADDING, pady=self.CONTENT_PADDING)
-        self.content.pack(expand=True, fill=BOTH)
+        self.body = Colored_Frame(self, background = self.CONTENT_BACKGROUND, padx=self.CONTENT_PADDING, pady=self.CONTENT_PADDING)
+        self.body.pack(expand=True, fill=BOTH)
 
 class Metro_LabelFrame(Frame):
     HEADER_BACKGROUND = "#1ba1e2"
@@ -91,8 +82,8 @@
         self._title_label = Label(header, text=title, foreground=self.HEADER_FOREGROUND, background=self.HEADER_BACKGROUND, font=self.FONT_HEADER)
         self._title_label.pack(anchor=W)
         
-        self.content = ColoredArea(self, padx=self.INNER_PADDING, pady= self.INNER_PADDING, background = self.CONTENT_BACKGROUND)
-        self.content.pack(expand=True, fill=BOTH)
+        self.body = Colored_Frame(self, padx=self.INNER_PADDING, pady= self.INNER_PADDING, background = self.CONTENT_BACKGROUND)
+        self.body.pack(expand=True, fill=BOTH)
         
     @property
     def title(self):
@@ -102,8 +93,6 @@
     def title(self, title):
         self._title = title
         self._title_label.configure(text=title)
-
-
 
 if __name__ == "__main__":
     
@@ -117,24 +106,24 @@
     row = Frame(root)
     row.pack()
     for i in range(4):
-        LabelFrame = Metro_LabelFrame(row, title="This is the title")
-        LabelFrame.pack(side=LEFT, padx=6, pady=9)
+        metro_labelframe = Metro_LabelFrame(row, title="This is the title")
+        metro_labelframe.pack(side=LEFT, padx=6, pady=9)
         for i  in range(5):
-            LabelFrame.content.make_label(text="This is line number %i"%i).pack(expand=True, fill=BOTH)
+            metro_labelframe.body.make_label(text="This is line number %i"%i).pack(expand=True, fill=BOTH)
     
     row = Frame(root)
     row.pack()
     
-    LabelFrame = Metro_LabelFrame(row, title="This is the title")
-    LabelFrame.pack(side=LEFT, padx=6, pady=9)
+    metro_labelframe = Metro_LabelFrame(row, title="This is the title")
+    metro_labelframe.pack(side=LEFT, padx=6, pady=9)
     
-    LabelFrame.content.make_label(text="One line").pack(anchor=W)
-    LabelFrame.content.make_label(text="Another line").pack(anchor=W)
-    LabelFrame.content.make_label(text="more lines...").pack(anchor=W)
-    quote = QuoteFrame(LabelFrame.content)
+    metro_labelframe.body.make_label(text="One line").pack(anchor=W)
+    metro_labelframe.body.make_label(text="Another line").pack(anchor=W)
+    metro_labelframe.body.make_label(text="more lines...").pack(anchor=W)
+    quote = QuoteFrame(metro_labelframe.body)
     quote.pack()
 
-    quote.content.make_label(text = "blah.. blah..blah..blah..blah..blah..").pack()
+    quote.body.make_label(text = "blah.. blah..blah..blah..blah..blah..").pack()
 
-    LabelFrame.content.make_label(text="more content here...").pack(anchor=W)
+    metro_labelframe.body.make_label(text="more body here...").pack(anchor=W)
     root.mainloop()

History