The dashboard is divided into two main sections:
Sidebar Navigation: A vertical panel with intuitive navigation buttons, a logo, and a footer.
Main Content Area: Includes a top header with search and user profile, colorful metric cards, a list of recent transactions, and a placeholder statistics section.
It uses a consistent color palette, emoji icons, and Frame, Label, and Button widgets to structure and beautify the layout.
What’s Inside the Code?
1. Sidebar Navigation
The sidebar contains:
- A title/logo area
- Navigation buttons like Dashboard, Wallet, Payment, etc.
- A footer with branding info
This part of the interface is fixed-width and provides quick access to different parts of the dashboard.
2. Main Header
The header includes:
- A dashboard title
- A search bar
- Notification icons (🔔, 💬)
- A user profile section
It’s designed to make the user feel welcome and informed right from the top.
3. Metric Cards
Four vibrant cards showcase:
- Total Invoices
- Paid Invoices
- Unpaid Invoices
- Invoices Sent
Each card includes:
- An icon
- A numeric value
- A label
These are styled using color-coded backgrounds for visual differentiation.
4. Middle Section: Transactions & Statistics
This section has two columns:
Left: A list of the latest transactions, showing site names, transaction amounts, and timestamps.
Right: A placeholder for statistics (bar charts or graphs can be added here later).
Complete Source Code
Key Implementation Details
1. Modern UI Design
We’ve created a professional color scheme using hex codes:
How It Works
Here’s a breakdown of how everything ties together:
- Classes & Methods: The PelioDashboard class manages layout and content creation.
- Color Management: A dictionary of color values keeps styling consistent across components.
- Data Simulation: Random sample data and placeholder UI elements make it easy to test functionality.
Code
def create_sidebar(self): """Create the left sidebar navigation""" self.sidebar = Frame(self.root, bg=self.colors['sidebar'], width=250) self.sidebar.pack(side='left', fill='y') self.sidebar.pack_propagate(False) # Logo and title logo_frame = Frame(self.sidebar, bg=self.colors['sidebar']) logo_frame.pack(fill='x', pady=20) # Pelio logo placeholder logo_label = Label(logo_frame, text="⚡ SENGIDEONS", font=('Arial', 18, 'bold'), fg='white', bg=self.colors['sidebar']) logo_label.pack(padx=20) # Navigation items nav_items = [ ("📊 Dashboard", True), ("💳 My Wallet", False), ("💰 Payment", False), ("🧾 Invoice", False), ("⚙️ Setting", False), ("📋 Transactions", False) ] for item, is_active in nav_items: bg_color = '#34495e' if is_active else self.colors['sidebar'] fg_color = 'white' nav_button = Button(self.sidebar, text=item, font=('Arial', 11), bg=bg_color, fg=fg_color, bd=0, pady=15, anchor='w', padx=20, cursor='hand2') nav_button.pack(fill='x', padx=10, pady=2) # Bottom section bottom_frame = Frame(self.sidebar, bg=self.colors['sidebar']) bottom_frame.pack(side='bottom', fill='x', pady=20) Label(bottom_frame, text="Payment Admin Dashboard", font=('Arial', 10), fg='#95a5a6', bg=self.colors['sidebar']).pack(padx=20) Label(bottom_frame, text="© 2025 All rights reserved.", font=('Arial', 9), fg='#7f8c8d', bg=self.colors['sidebar']).pack(padx=20, pady=5) def create_main_content(self): """Create the main content area""" self.main_frame = Frame(self.root, bg=self.colors['main_bg']) self.main_frame.pack(side='right', fill='both', expand=True) # Header self.create_header() # Content container with scrollable area content_canvas = Canvas(self.main_frame, bg=self.colors['main_bg'], highlightthickness=0) scrollbar = ttk.Scrollbar(self.main_frame, orient="vertical", command=content_canvas.yview) self.scrollable_frame = Frame(content_canvas, bg=self.colors['main_bg']) self.scrollable_frame.bind( "<Configure>", lambda e: content_canvas.configure(scrollregion=content_canvas.bbox("all")) ) content_canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw") content_canvas.configure(yscrollcommand=scrollbar.set) content_canvas.pack(side="left", fill="both", expand=True) scrollbar.pack(side="right", fill="y") # Create dashboard sections self.create_metric_cards() self.create_middle_section() self.create_bottom_section() def create_header(self): """Create the top header with search and user info""" header = Frame(self.main_frame, bg=self.colors['white'], height=80) header.pack(fill='x', padx=20, pady=20) header.pack_propagate(False) # Dashboard title Label(header, text="📊 Dashboard", font=('Arial', 24, 'bold'), fg=self.colors['text_dark'], bg=self.colors['white']).pack(side='left', padx=20, pady=20) # Right side - search and user right_frame = Frame(header, bg=self.colors['white']) right_frame.pack(side='right', padx=20, pady=20) # Search box search_frame = Frame(right_frame, bg='#f3f4f6', relief='flat') search_frame.pack(side='left', padx=10) search_entry = Entry(search_frame, font=('Arial', 10), bg='#f3f4f6', bd=0, width=20, fg=self.colors['text_light']) search_entry.pack(side='left', padx=10, pady=8) search_entry.insert(0, "Search Here...") # Notification badges notif_frame = Frame(right_frame, bg=self.colors['white']) notif_frame.pack(side='left', padx=10) # Bell icon with badge bell_btn = Button(notif_frame, text="🔔", font=('Arial', 16), bg=self.colors['white'], bd=0, cursor='hand2') bell_btn.pack(side='left', padx=5) # Message icon with badge msg_btn = Button(notif_frame, text="💬", font=('Arial', 16), bg=self.colors['white'], bd=0, cursor='hand2') msg_btn.pack(side='left', padx=5) # User profile user_frame = Frame(right_frame, bg=self.colors['white']) user_frame.pack(side='left', padx=10) # Profile picture placeholder profile_btn = Button(user_frame, text="👤", font=('Arial', 16), bg=self.colors['card_red'], fg='white', width=3, height=1, bd=0, cursor='hand2') profile_btn.pack(side='left') # User info user_info = Frame(user_frame, bg=self.colors['white']) user_info.pack(side='left', padx=10) Label(user_info, text="Hi Dennis", font=('Arial', 12, 'bold'), fg=self.colors['text_dark'], bg=self.colors['white']).pack(anchor='w') Label(user_info, text="dennisdorny@gmail.com", font=('Arial', 9), fg=self.colors['text_light'], bg=self.colors['white']).pack(anchor='w') def create_metric_cards(self): """Create the colorful metric cards""" cards_frame = Frame(self.scrollable_frame, bg=self.colors['main_bg']) cards_frame.pack(fill='x', padx=20, pady=10) # Card data cards_data = [ ("32,568", "Total Invoices", self.colors['card_green'], "📄"), ("8,558", "Paid Invoices", self.colors['card_blue'], "💳"), ("2,568", "Unpaid Invoices", self.colors['card_yellow'], "⏳"), ("668", "Total Invoices Sent", self.colors['card_red'], "📤") ] for i, (value, label, color, icon) in enumerate(cards_data): card = Frame(cards_frame, bg=color, width=280, height=122) card.grid(row=0, column=i, padx=10, pady=10, sticky='ew') card.pack_propagate(False) # Icon Label(card, text=icon, font=('Arial', 20), fg='white', bg=color).pack(pady=(15, 5)) # Value Label(card, text=value, font=('Arial', 24, 'bold'), fg='white', bg=color).pack() # Label Label(card, text=label, font=('Arial', 10), fg='white', bg=color).pack(pady=(0, 10)) # Configure grid weights for i in range(4): cards_frame.grid_columnconfigure(i, weight=1) def create_middle_section(self): """Create the middle section with transactions and statistics""" middle_frame = Frame(self.scrollable_frame, bg=self.colors['main_bg']) middle_frame.pack(fill='x', padx=20, pady=20) # Left side - Latest Transactions left_frame = Frame(middle_frame, bg=self.colors['white'], relief='flat', bd=1) left_frame.pack(side='left', fill='both', expand=True, padx=(0, 10)) # Transactions header trans_header = Frame(left_frame, bg=self.colors['white']) trans_header.pack(fill='x', padx=20, pady=(20, 10)) Label(trans_header, text="Latest Transactions", font=('Arial', 16, 'bold'), fg=self.colors['text_dark'], bg=self.colors['white']).pack(side='left') # Transactions list self.create_transactions_list(left_frame) # Right side - Statistics right_frame = Frame(middle_frame, bg=self.colors['white'], relief='flat', bd=1) right_frame.pack(side='right', fill='both', expand=True, padx=(10, 0)) # Statistics header stats_header = Frame(right_frame, bg=self.colors['white']) stats_header.pack(fill='x', padx=20, pady=(20, 10)) Label(stats_header, text="Statistics", font=('Arial', 16, 'bold'), fg=self.colors['text_dark'], bg=self.colors['white']).pack() # Create simple bar chart self.create_statistics_chart(right_frame) def create_transactions_list(self, parent): """Create the transactions list""" transactions_data = [ ("sengideons.com", "$4,67,859", "6 min ago", self.colors['card_blue'], "CA"), ("HSJ Express.com", "$89,859", "6 min ago", self.colors['card_yellow'], "HE"), ("InvestInvesthamim.Inc", "$3,43,67,859", "6 min ago", self.colors['card_green'], "II"), ("AvadStudio Inc", "$2,07,859", "6 min ago", self.colors['card_red'], "AS") ] for company, amount, time, color, initials in transactions_data: trans_row = Frame(parent, bg=self.colors['white']) trans_row.pack(fill='x', padx=20, pady=8) # Company icon icon_frame = Frame(trans_row, bg=color, width=40, height=40) icon_frame.pack(side='left', padx=(0, 15)) icon_frame.pack_propagate(False) Label(icon_frame, text=initials, font=('Arial', 10, 'bold'), fg='white', bg=color).place(relx=0.5, rely=0.5, anchor='center') # Company details details_frame = Frame(trans_row, bg=self.colors['white']) details_frame.pack(side='left', fill='x', expand=True) Label(details_frame, text=company, font=('Arial', 11, 'bold'), fg=self.colors['text_dark'], bg=self.colors['white']).pack(anchor='w') Label(details_frame, text=f"#{random.randint(100000, 999999)}-{random.randint(100, 999)}-{random.randint(100, 999)}", font=('Arial', 9), fg=self.colors['text_light'], bg=self.colors['white']).pack(anchor='w') # Amount and time right_details = Frame(trans_row, bg=self.colors['white']) right_details.pack(side='right') Label(right_details, text=amount, font=('Arial', 11, 'bold'), fg=self.colors['text_dark'], bg=self.colors['white']).pack(anchor='e') Label(right_details, text=time, font=('Arial', 9), fg=self.colors['text_light'], bg=self.colors['white']).pack(anchor='e') # Action button Button(right_details, text="⋯", font=('Arial', 12), bg=self.colors['white'], bd=0, cursor='hand2').pack(side='right', padx=10) # Pagination pagination = Frame(parent, bg=self.colors['white']) pagination.pack(fill='x', padx=20, pady=20) Label(pagination, text="Showing 1-4 from 60 Data", font=('Arial', 10), fg=self.colors['text_light'], bg=self.colors['white']).pack(side='left') # Page numbers page_frame = Frame(pagination, bg=self.colors['white']) page_frame.pack(side='right') for i, page in enumerate(['<', '1', '2', '3', '>']): bg = self.colors['card_blue'] if page == '1' else self.colors['white'] fg = 'white' if page == '1' else self.colors['text_dark'] Button(page_frame, text=page, font=('Arial', 10), bg=bg, fg=fg, bd=1, width=3, cursor='hand2').pack(side='left', padx=2) def create_statistics_chart(self, parent): """Create a simple statistics chart""" chart_frame = Frame(parent, bg=self.colors['white'], height=200) chart_frame.pack(fill='x', padx=20, pady=20) chart_frame.pack_propagate(False) # Simple bar chart using canvas canvas = Canvas(chart_frame, bg=self.colors['white'], height=150, highlightthickness=0) canvas.pack(fill='both', expand=True) # Draw bars bar_colors = [self.colors['card_green'], self.colors['card_red'], self.colors['card_blue'], self.colors['card_yellow']] bar_heights = [80, 60, 100, 45, 70, 85, 55, 90, 65, 75] bar_width = 25 spacing = 35 start_x = 30 for i, height in enumerate(bar_heights): x = start_x + i * spacing color = bar_colors[i % len(bar_colors)] # Draw bar canvas.create_rectangle(x, 130 - height, x + bar_width, 130, fill=color, outline="") # Legend legend_frame = Frame(parent, bg=self.colors['white']) legend_frame.pack(fill='x', padx=20, pady=10) legend_items = [("Green", self.colors['card_green']), ("Blue", self.colors['card_blue']), ("Yellow", self.colors['card_yellow']), ("Red", self.colors['card_red'])] for label, color in legend_items: item_frame = Frame(legend_frame, bg=self.colors['white']) item_frame.pack(side='left', padx=10) # Color dot dot = Frame(item_frame, bg=color, width=10, height=10) dot.pack(side='left', padx=(0, 5)) Label(item_frame, text=label, font=('Arial', 9), fg=self.colors['text_light'], bg=self.colors['white']).pack(side='left') def create_bottom_section(self): """Create the bottom section with balance and activity""" bottom_frame = Frame(self.scrollable_frame, bg=self.colors['main_bg']) bottom_frame.pack(fill='x', padx=20, pady=20) # Left side - Balance Card balance_frame = Frame(bottom_frame, bg=self.colors['card_blue'], width=400, height=200) balance_frame.pack(side='left', fill='y', padx=(0, 10)) balance_frame.pack_propagate(False) # Balance header Label(balance_frame, text="Balance", font=('Arial', 14, 'bold'), fg='white', bg=self.colors['card_blue']).pack(anchor='w', padx=20, pady=(20, 5)) # Amount Label(balance_frame, text="$ 4,929", font=('Arial', 24, 'bold'), fg='white', bg=self.colors['card_blue']).pack(anchor='w', padx=20) # Card number Label(balance_frame, text="•••• •••• •••• 3456", font=('Arial', 12), fg='white', bg=self.colors['card_blue']).pack(anchor='w', padx=20, pady=(10, 0)) # Card details details_frame = Frame(balance_frame, bg=self.colors['card_blue']) details_frame.pack(anchor='w', padx=20, pady=10) Label(details_frame, text="Valid Thru\n03/25", font=('Arial', 9), fg='white', bg=self.colors['card_blue']).pack(side='left') Label(details_frame, text="Name\nSen Gideons", font=('Arial', 9), fg='white', bg=self.colors['card_blue']).pack(side='left', padx=(30, 0)) # Middle section - Balance Details middle_frame = Frame(bottom_frame, bg=self.colors['white']) middle_frame.pack(side='left', fill='both', expand=True, padx=10) # Balance Details header Label(middle_frame, text="Balance Details", font=('Arial', 16, 'bold'), fg=self.colors['text_dark'], bg=self.colors['white']).pack(anchor='w', padx=20, pady=(20, 10)) # Total Balance Label(middle_frame, text="Total Balance", font=('Arial', 10), fg=self.colors['text_light'], bg=self.colors['white']).pack(anchor='w', padx=20) Label(middle_frame, text="$221,478", font=('Arial', 20, 'bold'), fg=self.colors['text_dark'], bg=self.colors['white']).pack(anchor='w', padx=20, pady=(0, 10)) # Monthly stats stats_row = Frame(middle_frame, bg=self.colors['white']) stats_row.pack(fill='x', padx=20, pady=10) # Last Month left_stat = Frame(stats_row, bg=self.colors['card_blue'], width=120, height=50) left_stat.pack(side='left', padx=(0, 10)) left_stat.pack_propagate(False) Label(left_stat, text="Last Month", font=('Arial', 9), fg='white', bg=self.colors['card_blue']).pack(pady=(8, 0)) Label(left_stat, text="$ 16,849", font=('Arial', 11, 'bold'), fg='white', bg=self.colors['card_blue']).pack() # Expenses Label(stats_row, text="Expenses\n$ 13,849", font=('Arial', 10), fg=self.colors['text_dark'], bg=self.colors['white']).pack(side='left', padx=20) # Other stats other_stats = Frame(middle_frame, bg=self.colors['white']) other_stats.pack(fill='x', padx=20, pady=10) Label(other_stats, text="Income $255.25", font=('Arial', 10), fg=self.colors['text_dark'], bg=self.colors['white']).pack(anchor='w') Label(other_stats, text="Total $365,478", font=('Arial', 10), fg=self.colors['text_dark'], bg=self.colors['white']).pack(anchor='w', pady=(5, 0)) # Right side - Activity activity_frame = Frame(bottom_frame, bg=self.colors['white'], width=250) activity_frame.pack(side='right', fill='y', padx=(10, 0)) activity_frame.pack_propagate(False) # Activity header activity_header = Frame(activity_frame, bg=self.colors['white']) activity_header.pack(fill='x', padx=20, pady=(20, 10)) Label(activity_header, text="Activity", font=('Arial', 14, 'bold'), fg=self.colors['text_dark'], bg=self.colors['white']).pack(side='left') Label(activity_header, text="$ 48,284", font=('Arial', 14, 'bold'), fg=self.colors['text_dark'], bg=self.colors['white']).pack(side='right') # Activity stats stats_frame = Frame(activity_frame, bg=self.colors['white']) stats_frame.pack(fill='x', padx=20, pady=10) Label(stats_frame, text="267 312 176", font=('Arial', 12), fg=self.colors['text_dark'], bg=self.colors['white']).pack() # Activity chart (simplified) chart_canvas = Canvas(activity_frame, bg=self.colors['white'], height=100, highlightthickness=0) chart_canvas.pack(fill='x', padx=20, pady=10) # Draw simple bars colors = [self.colors['card_green'], self.colors['card_red'], self.colors['card_blue']] heights = [60, 40, 70] for i, (height, color) in enumerate(zip(heights, colors)): x = 30 + i * 60 chart_canvas.create_rectangle(x, 80 - height, x + 40, 80, fill=color, outline="") # Month labels months = ["Sep", "Mar", "Apr"] for i, month in enumerate(months): x = 50 + i * 60 chart_canvas.create_text(x, 90, text=month, font=('Arial', 9), fill=self.colors['text_light']) # Activity list activities = [ "Dollars sit amet", "Dollars sit amet", "Dollars sit amet" ] for activity in activities: activity_row = Frame(activity_frame, bg=self.colors['white']) activity_row.pack(fill='x', padx=20, pady=2) # Color dot dot = Frame(activity_row, bg=self.colors['card_green'], width=8, height=8) dot.pack(side='left', padx=(0, 10)) Label(activity_row, text=activity, font=('Arial', 9), fg=self.colors['text_light'], bg=self.colors['white']).pack(side='left') def populate_data(self): """Populate dashboard with sample data""" pass # Data is already populated in the creation methods
Why Tkinter for Dashboards?
Tkinter is:
- Easy to use and bundled with Python
- Highly customizable with basic widgets
- Great for creating lightweight desktop applications
🚀 Ready to Customize?
You can enhance this dashboard by:
- Connecting it to a real database
- Adding data visualization using matplotlib or tkinter.ttk.Treeview
- Creating user authentication and multi-page navigation
✅ Conclusion
This project demonstrates how to use Tkinter to build a professional-looking admin dashboard interface. Whether you’re a beginner or looking to build internal tools, this example is a great starting point to learn GUI design with Python.
Happy coding! 🎉
Disclaimer
Sengideons.com does not host any files on its servers. All point to content hosted on third-party websites. Sengideons.com does not accept responsibility for content hosted on third-party websites and does not have any involvement in the same.