# 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()