# encoding: utf-8
# Author: Miguel Martínez López
try:
from Tkinter import Tk
from ttk import Frame, Button, Style
from Tkconstants import *
except ImportError:
from tkinter import Tk
from tkinter.ttk import Frame, Button, Style
from tkinter.constants import *
class Pagination(Frame):
_new_index = 0
def __init__(self, master, first_page, last_page, normal_button, selected_button, padding = None, font=None, command=None):
Frame.__init__(self, master)
self._command = command
self.style_name_selected = 'SelectedPage%s.TButton'%Pagination._new_index
self.style_name_normal = 'Page%s.TButton'%Pagination._new_index
Pagination._new_index += 1
s = Style()
for style_name, style_config in ((self.style_name_normal, normal_button), (self.style_name_selected, selected_button)):
if "padding" in style_config:
s.configure(style_name, padding=style_config["padding"])
elif padding is not None:
s.configure(style_name, padding=padding)
if "font" in style_config:
s.configure(style_name, font=style_config["font"])
elif font is not None:
s.configure(style_name, font=font)
if "background" in style_config and "activebackground" in style_config:
s.map(style_name, background=[('active', style_config["activebackground"]), ('!active', style_config["background"])])
if "foreground" in style_config and "activeforeground" in style_config:
s.map(style_name, foreground=[('active', style_config["activeforeground"]), ('!active', style_config["foreground"])])
self._list_of_buttons = []
for page_number in range(first_page, last_page+1):
button = Button(self, text=page_number, style=self.style_name_normal, width=0)
button.configure(command=lambda button=button: self._on_button_selected(button))
button.pack(side=LEFT)
self._list_of_buttons.append(button)
self._selected_button = None
def _on_button_selected(self, button):
if self._selected_button is not None:
self._selected_button.configure(style = self.style_name_normal)
self._selected_button = button
button.configure(style=self.style_name_selected)
if self._command is not None:
self._command(self.selected_page)
def select_page(self, page_number):
page_number = int(page_number)
for button in self._list_of_buttons:
if int(button["text"]) == page_number:
self._selected_button = button
return
@property
def selected_page(self):
return int(self._selected_button["text"])
page = selected_page
if __name__ == "__main__":
try:
from ttk import Label
except ImportError:
from tkinter.ttk import Label
root = Tk()
pagination_style = {
"padding":(12,6, 12,6),
"normal_button": {
"font": ("Verdana", 12),
"foreground": "#337ab7",
"activeforeground":"#23527c",
"background": "white",
"activebackground": "#eee"
},
"selected_button": {
"font":("Verdana", 12, "bold"),
"foreground":"#fff",
"activeforeground":"#fff",
"background":"#337ab7",
"activebackground":"#337ab7"
}
}
pagination_style2 = {
"padding":(12,6, 12,6),
"normal_button": {
"font": ("Verdana", 12),
"foreground": "black",
"activeforeground":"black",
"background": "white",
"activebackground": "#ccc"
},
"selected_button": {
"font":("Verdana", 12, "bold"),
"foreground":"white",
"activeforeground":"#fff",
"background":"#f44336",
"activebackground":"#f44336"
}
}
pagination_style3 = {
"padding":(12,6, 12,6),
"normal_button": {
"font": ("Verdana", 12),
"foreground": "#717171",
"activeforeground":"#717171",
"background": "#e9e9e9",
"activebackground": "#fefefe"
},
"selected_button": {
"font":("Verdana", 12, "bold"),
"foreground":"#f0f0f0",
"activeforeground":"#f0f0f0",
"background":"#616161",
"activebackground":"#616161"
}
}
pagination_style4 = {
"padding":(12,6, 12,6),
"normal_button": {
"font": ("Verdana", 12),
"foreground": "#feffff",
"activeforeground":"#feffff",
"background": "#3e4347",
"activebackground": "#3d4f5d"
},
"selected_button": {
"font":("Verdana", 12, "bold"),
"foreground":"#feffff",
"activeforeground":"#feffff",
"background":"#2f3237",
"activebackground":"#2f3237"
}
}
pagination_style5 = {
"padding":(12,6, 12,6),
"normal_button": {
"font": ("Verdana", 12),
"foreground": "#2E4057",
"activeforeground":"#2E4057",
"background": "white",
"activebackground": "white"
},
"selected_button": {
"font":("Verdana", 12, "bold"),
"foreground":"white",
"activeforeground":"white",
"background":"#64a281",
"activebackground":"#64a281"
}
}
def print_page(page_number):
print("page number %s"%page_number)
Label(root, text="Style 1:").pack(padx=20, anchor=W)
pagination = Pagination(root, 1,5, command=print_page, **pagination_style)
pagination.pack(pady=(5,20), padx=20)
Label(root, text="Style 2:").pack(padx=20, anchor=W)
pagination = Pagination(root, 1,5, command=print_page, **pagination_style2)
pagination.pack(pady=(5,20), padx=20)
Label(root, text="Style 3:").pack(padx=20, anchor=W)
pagination = Pagination(root, 1,5, command=print_page, **pagination_style3)
pagination.pack(pady=(5,20), padx=20)
Label(root, text="Style 4:").pack(padx=20, anchor=W)
pagination = Pagination(root, 1,5, command=print_page, **pagination_style4)
pagination.pack(pady=(5,20), padx=20)
Label(root, text="Style 5:").pack(padx=20, anchor=W)
pagination = Pagination(root, 1,5, command=print_page, **pagination_style5)
pagination.pack(pady=(5,20), padx=20)
root.mainloop()
Diff to Previous Revision
--- revision 3 2016-11-20 12:05:10
+++ revision 4 2016-11-20 19:09:17
@@ -1,3 +1,7 @@
+# encoding: utf-8
+# Author: Miguel Martínez López
+
+
try:
from Tkinter import Tk
from ttk import Frame, Button, Style