Python Regex Tester, Refined and Ready for Work

Day 15 of 100 Days Coding Challenge: Python

Regex: the ancient incantation whispered into the void to extract meaning from chaos—or at least, that’s how it feels when you’re debugging it. At work, I’ve been diving into Power Automate, and with a little AI sidekick magic, I managed to whip up a subroutine. Here’s the catch: management is monitoring AI usage as if it were a high-budget Netflix subscription. So if I want to justify it, I have to show results—preferably in PDF form or extracted text using OCR. That’s where regex comes in, acting like a digital highlighter that says, “Hey, this is the bit I want.”
Sure, there are online regex testers, but handing my data to a mystery site on the internet? Not ideal. So, why not just build my own? And voilà—Regex Tester was born, with all the drama of pattern matching and none of the corporate paranoia.

Today’s Motivation / Challenge

Today’s goal was all about building something practical and safe. When you’re automating document workflows at work—especially with sensitive PDFs or scanned images—you want something you can trust. This project enables me to test patterns locally without sharing data, providing me with full control and peace of mind. Additionally, it’s oddly satisfying to watch regex do its detective work in real-time.

Purpose of the Code (Object)

This simple GUI-based tool lets you test regular expressions against any input text. You type in a pattern, paste some text, and instantly see what matches—along with where they appear. It’s a private sandbox for your regex experiments, with none of the “Oops, I just uploaded company secrets to a sketchy website” anxiety.

AI Prompt:

Write a Python program using Tkinter that creates a GUI for testing regular expressions. The user should be able to input a regex pattern and a test string. When a button is pressed, the program should display all matching strings and their positions. Display errors if the pattern is invalid. Keep the interface clean, responsive, and beginner-friendly.


Functions & Features

  • Input fields for both regex pattern and test string
  • “Test Regex” button to trigger evaluation
  • Results window showing matches and positions
  • Error handling for invalid patterns
  • All offline—no data ever leaves your machine

Requirements / Setup

bash

CopyEdit

Python 3.x (Tkinter is included in standard library)

No need to install anything—just run the .py file.

Minimal Code Sample

import re

compiled = re.compile(pattern)

matches = compiled.finditer(test_string)

This finds all the places your pattern matches the test string—like a digital bloodhound sniffing out structure.

Regex Texter GUI

Notes / Lessons Learned

I tested it with some of the Frankenstein-like regex I use at work—and it worked like a charm. Finally, no more awkward toggling between browsers and paranoia over leaking sensitive data. And best of all? It feels good to have built something so useful with my own keyboard and caffeine. Regex might still be cryptic sorcery, but now at least it’s my sorcery.

Optional Ideas for Expansion

  • Add a checkbox for case-insensitive search
  • Highlight matches directly in the test text field
  • Save and reload common patterns from a local file

Scan, Save, Share: QR Codes to the Rescue

Day 14 of 100 Days Coding Challenge: Python

I honestly can’t pinpoint when QR codes became part of our daily visual diet. One day, strange hieroglyphics appeared on a poster, and the next, they were everywhere—from ketchup bottles to gravestones.

I’ve been eyeing them for blog promotion—imagine pointing your phone at a code and instantly landing on a beautifully written post (like this one, for example). It’s a hands-free way to impress your friends and confuse your cat. I even considered slapping a QR code on my GitHub repository just for fun. Why type a URL when you can just scan your way into the internet like a wizard?

Today’s Motivation / Challenge

Today’s project taps into one of the most useful real-world tools you can build with Python: a QR code generator. It’s simple, sleek, and satisfying. If you’ve ever wanted to look like a tech-savvy genius without having to build a rocket, this is your moment. Whether you’re promoting your portfolio, sharing your Wi-Fi, or sending someone directly to your meme collection—QR codes make it smooth and snappy.

Purpose of the Code (Object)

This code takes any text—like a URL, message, or even an email—and turns it into a QR code image that anyone can scan. It simplifies how people access your content, and saves you from typing out long, typo-prone links. Think of it as a shortcut to being impressive.

AI Prompt: Please write a code for “QR code generator” in Python. #provide me, description, #main function, #Repositely name. Make it a GUI Version.

Functions & Features

  • Takes user input and generates a QR code
  • Saves the code as a PNG file
  • Let the user choose where to save the file via GUI
  • Shows a preview of the generated QR code

Requirements / Setup

Make sure you have Python 3.x and install these packages:

css

CopyEdit

pip install qrcode[pil] Pillow

Minimal Code Sample

qr = qrcode.make(“https://example.com”)

qr.save(“example.png”)

GR Generator

Creates a QR code for the link and saves it as an image file.

Notes / Lessons Learned

The first version of this code worked fine—until I forgot to add “.png” to the filename. The result? A mysterious, extension-less file that no image viewer wanted to be friends with.

Then came the GUI upgrade, which was a game changer. Not only could I see the QR code before saving it, but I could also choose exactly where to drop the file—no more hunting around my project folder like a digital bloodhound. It made the process smoother, less error-prone, and oddly satisfying. I didn’t expect a humble little square to make me feel so accomplished.

Optional Ideas for Expansion

  • Add a field to customize QR code color (neon green, anyone?)
  • Embed a logo in the center of the QR code for branding
  • Create a batch mode to generate QR codes from a list of links in a CSV file

A Day of Labs, and Strategically Skipping a Run Without Guilt

Brian’s fitness journal after a brain stroke

After checking the weather forecast yesterday and mentally mapping out today’s schedule, I reached a firm conclusion: squeezing in a run would be heroically unpleasant. I have a blood draw scheduled for 1:30 p.m., which makes a midday run less “healthy habit” and more “logistical nightmare.”

My wife kindly took the day off to drive me to the lab. My nephrologist recently changed lab locations, and what used to be a walkable errand is now a 39-minute drive. Progress, apparently, comes with mileage.

Since she already had the day off, my wife suggested stopping by a secondhand bookstore on the way home. We haven’t been in nearly a year, but we like wandering through shelves where books cost less and come with mysterious past lives. Used books don’t bother either of us—stories age well.

The drive itself was pleasant. Being driven to a lab is significantly nicer than walking there, especially when the destination includes an underground parking garage shared by two identical buildings. Naturally, we took the wrong elevator and ended up in the wrong building.

Everything looked… medical. That was the problem. After a moment of quiet confusion and mutual suspicion, I realized we were definitely not where we were supposed to be. Medical offices are impressively interchangeable. We regrouped, descended, ascended again, and eventually found the correct lab.

Afterward, we rewarded ourselves with a visit to the bookstore. My wife browsed happily and found Lolita, which she’s wanted to read but avoided because of its eye-watering Amazon price. The secondhand copy solved that problem instantly. She didn’t care that it wasn’t new—victory is victory.

Once we returned home, reality resumed. Supper needed cooking. Pies need to be baked for tomorrow’s feast. And just like that, the run officially exited today’s agenda.

Lessons Learned

I usually try to schedule appointments on non-running days to avoid this exact situation, but the lab’s availability didn’t cooperate this time. So it goes.

Being out for several hours tightened the rest of the day’s schedule—for both of us. Even on her day off, my wife had to reshuffle everything to fit the lab visit. Efficiency never truly clocks out.

At least I’ve already completed my running goals for the year, so I feel no pressure to “make up” today’s missed run. If anything, the extra rest might help me recover fully and push harder on Friday.

Sometimes progress looks like running.

Sometimes it looks like skipping a run—with intention, books, and pie preparation waiting at home.

Python File Renamer: Turning Folder Chaos into Digital Zen

Day 13 of 100 Days Coding Challenge: Python

Have you ever dumped a bunch of photos from your phone or camera onto your computer, only to be greeted by a wall of files named IMG_2034 or DSC_0198? That was me last week. We’d just come back from visiting my dad in Indiana, and I spent hours renaming photos just so I’d know what was what later. By hour three, I started questioning my life choices.

Today’s app was born out of that chaos. It’s for anyone who’s ever opened their Downloads folder and felt genuine fear. You know the scene—screenshot(385).png, resume_final_final_really_FINAL.docx, and misc.zip (which, let’s be honest, contains nothing but regret).

Eventually, I snapped. I built a File Renamer. Because at some point, every coder realizes the real enemy isn’t broken code—it’s bad file names. My little app brought order to the madness, one underscore at a time. Justice was served. Silently.

Today’s Motivation / Challenge

File naming seems trivial—until it isn’t. Whether it’s organizing screenshots, exported reports, or the fifth version of your side project’s logo, we’ve all played the “rename, regret, repeat” game. This challenge gave me a chance to bring order to chaos, while flexing my Python skills in a way that solves a real, everyday annoyance. Plus, there’s something oddly satisfying about watching a folder transform from digital dumpster to methodical masterpiece.

Purpose of the Code (Object)

This Python app batch-renames files in a folder using a pattern you choose—like photo_1.jpg, photo_2.jpg, and so on. It lets you preview changes, filter by file type, and confirm before anything happens. The final version even adds an undo option and keeps a time-stamped log of renamed files.

AI Prompt:

“Please create a Python code File renamer.”

“Can you add the following function to the GUI version? #Add an undo feature #Add a log file to save old/new names.”

Functions & Features

  • Select a folder with a file dialog (no more mistyped paths)
  • Set custom prefix and starting number
  • Filter files by extension (e.g., .txt, .jpg)
  • Preview all renaming before it happens
  • Automatically log all rename operations with a timestamp
  • Undo your most recent renaming session

Requirements / Setup

  • Python 3.6+
  • No extra libraries needed (just tkinter, which comes with Python)

Minimal Code Sample

for i, file in enumerate(files, start=start_number):

    ext = os.path.splitext(file)[1]

    new_name = f”{prefix}{i}{ext}”

    os.rename(os.path.join(folder_path, file), os.path.join(folder_path, new_name))

This is where the magic happens: renaming each file while keeping its original extension.

File Renamer GUI

Notes / Lessons Learned

So all your files become lovely, logical things like file_1.txt, file_2.txt, and file_3.txt. It was beautiful. It was organized. It was… terrifyingly powerful. That’s when I remembered something crucial: I never get folder paths right. Backslashes, forward slashes, hidden Unicode weirdness—my fingers always betray me.

So I thought, “Let’s make this a GUI.” Because honestly, why should I suffer when I can just click a folder like a functioning adult?

New version, new vibe. It had buttons. It had folder selection dialogs. It even had a preview feature, like the app was politely saying, “Here’s what you’re about to do. You sure about this?” If there were no files to rename, it didn’t throw a tantrum—it simply shrugged and bowed out.

And just when I thought it was “done,” I asked myself:

What if I mess this up?

Enter: undo button and activity log.

Because if we’re going full Renamer Pro Mode™, I want receipts. I added:

  • A complete log of what each file used to be called
  • A timestamp of when the operation occurred
  • An undo feature, because I’m not about to manually rename everything back like it’s 2003

Once I tested everything (successfully, I might add—zero casualties), I realized something strange and wonderful:
This tiny project gave me an idea for improving a workflow at my day job. Turns out, renaming a bunch of files can actually inspire how to batch-handle documents in Power Automate. Who knew?

Oh, and one last grown-up move: I finally added a license to the project.

Here’s what I learned:

A License Type

  • MIT: Super chill. Basically says, “Take it, use it, remix it—just don’t sue me.”
  • GPL: More of a Robin Hood. If you improve it, you share it.
  • Apache 2.0: Like MIT but with a legal helmet.
  • No License: Says, “I’m not ready for commitment.” Basically off-limits.

I went to MIT because this little renamer deserves to be free.

Optional Ideas for Expansion

  • Add a “dry run” mode to simulate renaming without touching files
  • Add support for multiple undo steps (not just one session)
  • Export the log as a CSV file for spreadsheet nerds (no judgment)

Soup Season, Anniversary Planning, and the Great Headset Experiment

Brian’s fitness journal after a brain stroke

Today felt properly cold—the kind of cold that makes you question every life choice involving going outside. Thankfully, we had already scheduled soup for dinner, which felt like winning the weather lottery.

Normally, I’m not a big soup person. It’s fine, it’s food, it’s warm—but I don’t dream about it. That said, once the temperature drops, soup and I get along much better. And this particular soup has quietly been promoted to “winter favorite” status in our house.

Aside from making soup, today turned into a planning day. First, there’s Friday: my wife and I are celebrating our wedding anniversary by going to a new restaurant. This is a departure from our usual routine, which means my inner scheduler immediately asked, “Okay, but when are we running?” I have to adjust my plan for today.

Time Management

After checking the restaurant’s opening time and backtracking our ideal departure, I calculated that I’ll need to start my run by 9:00 a.m. to be cleaned up and ready to leave on time. To make sure this is realistic and not fantasy math, I’m going to test it tomorrow: start the run at 9, then see what time I’d theoretically be ready to go out.

Headset Charging Logistics

The second problem looming over my otherwise simple life: headset charging logistics.

My previous headset battery died a tragic early death, likely because I had been charging it overnight like a phone. With the new one, I’ve switched to a healthier habit—charging it at my desk while I eat breakfast. So far, this has worked beautifully, and the battery seems to be aging more gracefully than the last one.

But there’s a catch.

Once spring comes, I’ll shift my runs back to before breakfast. That means my “charge while eating” system may no longer guarantee enough power to get me through a full run—or a mowing session. Future-me would be very annoyed to discover a dying headset at kilometer three.

So, I need a new plan.

Right now, I’m leaning toward setting an 8:00 p.m. reminder on my phone to plug in the headset. That gives it about an hour to reach a full charge before I get ready for bed around 9. Later this week, I’ll run a little experiment: fully charge it by 9 p.m., then see if that charge comfortably lasts the 12 hours until I’m done with my morning run or yard work.

It’s a small thing, but having these pieces in place—soup simmering, anniversary plans mapped out, and a charging schedule for my headset—makes the week feel a little more under control.

Cold days are easier to face when the soup is hot, and the logistics are quietly cooperating.

Type Like No One’s Watching (But Save That High Score)

Day 12 of 100 Days Coding Challenge : Python

Long before I was writing Python, I was tapping away on a keyboard—but not as a programmer. Nope. I was just a kid in the ’70s with a front-row seat to the future.

My school had not one, but two full rooms of NEC computers (shout-out to NEC, Japan’s pride in beige technology). We even had an official typing class, which sounded very cool… until it started.

See, I thought I’d crush it. I played the piano from a young age, and I was confident—too confident. I figured typing would be the same thing: fingers flying, rhythm flowing, applause optional. Spoiler: it wasn’t.

Turns out, typing is hard when you don’t know where any of the keys are, and your muscle memory insists “A” should make a musical note.

Still, the basic typing program we used worked its magic, and I slowly learned my way around the keyboard. Though to this day, alphanumeric typing still trips me up (looking at you, @ and &).

But hey—nostalgia + Python = today’s challenge:

Today’s Motivation / Challenge

I wanted to recreate the magic of those old typing tutor programs—not because I needed one, but because I was curious if I could build one myself. It was part nostalgia, part challenge, and entirely satisfying to see it work. For any beginner, it’s a great way to practice coding while revisiting a skill we’ve all struggled with at some point: typing fast without panicking.

Purpose of the Code (Object)

This program is a simple typing speed test that measures how fast you can type a sentence. It starts timing when you begin typing and stops when you hit Enter. Then, it tells you how many words you typed per minute. It’s a fun way to practice your typing skills—like those old-school typing tutor programs, but one you built yourself!

AI Prompt: 

Please give me the Python code for the #Typing speed test. After the speed test, it gives you the typing speed per minute. The speed test has started button. #save the last highest score #restart button. Create in GUI.

In the code, I did not want to do it in the Python code environment; rather, I want to do it in a GUI environment. But with a GUI, I need a “Start Button”. 

Functions & Features

List the program’s main capabilities using bullet points. Keep each point brief. Focus only on the essential, core functions.

Example:

  • Calculates typing speed in words per minute
  • Starts the timer when you begin typing
  • Saves high score locally for future runs

Requirements / Setup

State any software, Python version, or libraries needed. Keep it clean and minimal.

pip install requests

Minimal Code Sample

First, we start the clock with start_time = time.time(). Think of it like shouting “Go!” at yourself before a typing race—only the stopwatch is a Python function that quietly counts milliseconds since 1970. Then comes the heart of the drama: typed_text = input(“Start typing: “). This line patiently waits while you furiously hammer out your response, possibly misspelling every third word in your panic to go fast.

Once you hit Enter, we slam the brakes with end_time = time.time(), capturing exactly how long your typing sprint lasted. And now for the moment of truth: Python does the math with print(“WPM:”, len(typed_text.split()) / ((end_time – start_time) / 60)). This gem splits your sentence into words, counts them, and divides by how many minutes you spent typing—voilà, words per minute (WPM)! It’s like a speedometer for your fingers.

And just in case the future, you forget what this code does, there’s a kind little comment: # Calculates words per minute from start to finish. Consider it the sticky note you didn’t know you’d need.

Typing Speed Test

Notes / Lessons Learned

In the code, I did not want to do it in the Python code environment; rather, I want to do it in a GUI environment. But with a GUI, I need a “Start Button”. It helps me to control when I actually started typing. 

Optional Ideas for Expansion

  • Add sound effects when the test begins and ends
  • Track accuracy by comparing typed text to the original
  • Display a leaderboard with names and scores

Weather Up! (And API Down… Then Up Again)

Day 11 of 100 Days Coding Challenge: Python

Let’s talk weather. Today’s project is a Python weather app using the OpenWeatherMap API—because there’s nothing like stepping out in a parka when it’s 80 degrees and sunny. I wanted a tool that would tell me if the sky is smiling or sobbing.

My goal? Get the current weather description (like “clear sky” or “air you can drink”), temperature in both Celsius and Fahrenheit (because I live in Celsius and my husband lives in Fahrenheit—we’ve agreed to disagree), and humidity (mostly for hair-related decisions). If this app could avoid one argument about overdressing, it would already be worth it.

Today’s Motivation / Challenge

The motivation was simple: make a useful, real-world app that doesn’t just live in the land of console output. Also, this was the perfect excuse to play with an API and brush up on Python’s ability to talk to the internet like a well-mannered bot. Plus, nothing says “grown-up developer” like a weather app you built yourself.

Purpose of the Code (Object)

This program lets you type in a city name and then fetches the current weather for that location. It displays the weather description, temperature in both Celsius and Fahrenheit, and the humidity. It’s a lightweight, beginner-friendly way to explore APIs, data handling, and basic user interaction with Python. No fancy dashboards, just solid weather facts.

AI Prompt: Make it cleaner

Create a simple Python weather checker using the OpenWeatherMap API. It should take a city name as input and return weather description, temperature in Celsius and Fahrenheit, and humidity. Keep it beginner-friendly and avoid unnecessary complexity. Please make the code for the GUI.

Functions & Features

  • Fetches real-time weather for any city using OpenWeatherMap API
  • Displays weather description, temperature (°C and °F), and humidity
  • Supports basic error handling (invalid city names, bad API keys, etc.)

Requirements / Setup

  • Python 3.x
  • requests library

pip install requests

Minimal Code Sample

response = requests.get(f”https://api.openweathermap.org/data/2.5/weather?q={city}&appid={API_KEY}&units=metric”)

data = response.json()

temp_c = data[‘main’][‘temp’]

temp_f = (temp_c * 9/5) + 32

Weather Checker App

This little stretch of code is like your personal weather butler. First, it knocks on OpenWeatherMap’s digital door and politely asks, “Excuse me, what’s the weather like in [city] today?” Then it grabs the answer, digs into the juicy details, and pulls out the temperature in Celsius. But wait—because not everyone lives in metric harmony—it whips out its calculator and converts it into Fahrenheit, just in case someone in the household insists on imperial drama.

Notes / Lessons Learned

I got the code, ran it… 401 error. Unauthorized. Rude. I copied the API key. I pasted it into my browser like so:
https://api.openweathermap.org/data/2.5/weather?q=Chicago&appid={API key}

Still 401. I stripped the key just in case it was haunted by invisible characters:

 API_KEY = “your_api_key”.strip()

Nada.

Then I tried curl from the command line like a tech-savvy detective:

 curl “https://api.openweathermap.org/data/2.5/weather?q=Chicago&appid={API_KEY}&units=metric”

 And BOOM—it worked!

Turns out my API key hadn’t activated yet. (Yes, that’s a thing. No, I didn’t read the fine print. Yes, I will next time. Maybe.)
Once the key was activated, I plugged it into my app and voilà—weather at my fingertips.

Optional Ideas for Expansion

  • Add a simple GUI with tkinter
  • Show weather-based icons or descriptions (e.g., “Bring an umbrella” for rain)
  • Include a 3-day forecast by upgrading to the OpenWeatherMap One Call API

Hangman: Now With 100% More Drama

Day 10 of 100 Days Coding Challenge: Python

Today, I felt bold. No more basic calculators. No more polite input prompts. I wanted to make a game—something a little more chaotic good. So I chose the classic: Hangman. But not just any hangman. Oh no. I wanted emojis, buttons, sound effects, and drama.

The goal? Create something that could rival middle school memories, minus the chalkboard and emotional scarring. I didn’t just want to code—I wanted a full-blown performance. One wrong guess and boom, a dramatic sound plays. It’s Hangman, but with flair like Shakespeare meets Tkinter.

Today’s Motivation / Challenge

Games are fun to build because they feel alive. They react, they make noise, they mock your guesses (sometimes too quickly). This project allowed me to apply everything I’ve learned so far—logic, GUIs, and user input—but in a playful way. It also scratched that nostalgic itch of typing letters into a school computer and hoping not to draw the stick figure’s head. Plus, there’s something weirdly satisfying about pushing a button and hearing a ding. It’s Pavlovian, really.

Purpose of the Code (Object)

This project creates a simple Hangman game with a graphical interface. The player guesses letters by clicking buttons, and the game shows progress with emoji art and sound effects. It’s a fun and interactive way to practice conditionals, loops, and GUI design—without requiring any advanced programming knowledge. Beginners can build it, play it, and immediately annoy their family with the sound effects.

AI Prompt: Make it cleaner.

Create a Hangman game in Python using Tkinter. Include emoji-based visuals for the hangman and sound effects for correct, incorrect, win, and lose outcomes. Add a restart button to replay without restarting the app.

Functions & Features

  • Button-based letter guessing (no typing required)
  • Emoji visuals that change with each incorrect guess
  • Sound effects for correct, incorrect, win, and lose outcomes
  • Restart button to play again instantly
  • Tracks lives and guessed letters in real time

Requirements / Setup

  • Python 3.x
  • Tkinter (comes with Python)

Install playsound module (use this version!):


pip install playsound==1.2.2

Minimal Code Sample

from playsound import playsound

def guess_letter(letter):

    global lives

    if letter not in secret_word:

        lives -= 1

        playsound(“wrong.wav”)  # Plays sound for wrong guess

This plays a sound when the user guesses incorrectly.

hungman_gui

Notes / Lessons Learned

Turns out version 1.2.2 of the playsound module works best, so if you try this at home—just skip the suffering and install that one. You’re welcome. I grabbed a few .wav files from freesound.org, which is great, but somehow every username I tried was taken. Even “CodeWizard47” and “ILoveLoops.” Apparently I’m not special. Also, be warned: your .wav files must be in the same folder as your script unless you create an asset folder and specify the path.

Sound + visuals = more chaos to debug, but also way more fun to play.

Optional Ideas for Expansion

  • Add a timer to increase the pressure
  • Create categories (animals, tech terms, random snacks)
  • Keep score across rounds or show a leaderboard

The Mysterious Case of My Monday Weight That Didn’t Move

Brian’s fitness journal after a brain stroke

After my run today, I stepped on the scale expecting the usual Monday plot twist—only to find that my weight and body composition hadn’t changed since Saturday. This was deeply suspicious.

For the past several weeks, Monday has reliably been my heaviest day of the week. I’ve learned not to take it personally. I usually blame the weekend—and more specifically, pizza. Delicious, sourdough-based, entirely worth it pizza.

My kidneys, however, do not behave like those of a perfectly cooperative adult. Depending on what I eat, my body becomes very enthusiastic about holding onto water. Most days, we eat healthy, homemade meals. Pizza is strictly a once-a-week luxury. Still, every Sunday I make sure pizza happens. Every Monday, my weight usually responds accordingly—thanks to a combination of glycogen storage and water retention.

So today’s unchanged number was unexpected.

I generally try not to obsess over my weight. It can swing by a few pounds easily, and I’ve learned not to panic. This past weekend, I ate exactly as I usually do. My exercise routine was also mostly unchanged—except for a peaceful three-kilometer walk with my wife on Sunday. The weather was lovely, and she wanted some sunshine. I wouldn’t expect that walk to single-handedly rewrite my Monday numbers, but I can’t think of any other explanation either.

I track my weight alongside my other biometrics because my nephrologist uses these trends to monitor my overall health. When we meet, he checks for sudden changes in weight, blood pressure, or heart rate. His rule of thumb is simple: sharp shifts usually mean something is going on inside the body.

Since I’m less active now than I was in the summer, I actually expected maintaining my weight to become easier. But because I move less in winter, I’ve also cut back on snacks. With kidney disease, almost everything seems to contain something I’m supposed to limit—phosphate, sugar, potassium, salt. Sometimes avoiding food altogether feels like the safest strategy.

Because my weight usually fluctuates more than this, today’s stability caught me off guard. At the same time, it means I need to be more careful this week. Starting lower than usual raises the risk of losing muscle too quickly—and that’s something my doctor very much does not want.

So for now, I’ll watch the numbers, eat carefully, move thoughtfully, and let the scale do its strange little science experiment in peace.

Split Happens: A GUI Tip Calculator That Doesn’t Judge

Day 9 of 100 Days Coding Challenge: Python

Once upon a time—aka last year—I built my first tip calculator in Python. It lived in the command line, wore black, and gave off strong hacker-in-a-diner vibes. You’d open the terminal, type in your numbers, and squint like you were breaking into a Michelin-starred mainframe.
Fast forward to today: that humble little tool got a much-needed makeover. Out with the minimalism, in with the buttons and window dressing. I gave it a GUI, added some visual flair, and—because I can’t resist—threw in a few emoji just for the drama. Because splitting the check shouldn’t feel like tax season, it should feel like friendship, math you can trust, and just a dash of fun.

Today’s Motivation / Challenge

Splitting the bill is easy… until someone pulls out a calculator and says, “Wait, how much with tip?” Then it becomes a group project in advanced math, complete with decimal debates and passive-aggressive sighs. Today’s challenge was to take that stress and turn it into something visual, intuitive, and mildly delightful. A GUI tip calculator solves a real-world problem with just enough code to feel proud—but not overwhelmed. It’s also a great excuse to practice building interfaces without becoming a full-time software architect.

Purpose of the Code (Object)

This program prompts the user to enter the number of people in the group, the total bill, and the desired tip percentage. Then it calculates the tip, adds it to the total, and shows how much each person owes. It’s a handy tool for group dinners or awkward birthday lunches when no one wants to do mental math.

AI Prompt

Create a GUI app in Python that:

  • Asks the user for number of people, bill amount, and tip percentage
  • Calculates total tip, total amount with tip, and per-person payment
  • Displays the results in a user-friendly window with labeled input fields and a result area

Functions & Features

  • Prompts for number of people, bill amount, and desired tip percentage
  • Calculates total tip and total amount
  • Splits the bill evenly between party members
  • Displays everything in a clean, readable GUI with labeled entries and a result section

Requirements / Setup

Library Requirement: pip install tk

This app runs on Python 3.x and uses the built-in tkinter module for the interface.

Minimal Code Sample


tip_amt = receipt_amt * (tip_percent / 100)
total_amt = receipt_amt + tip_amt
per_person = total_amt / num_people

This logic calculates the tip and divides the total among the group.

TipTopSplitter

Notes / Lessons Learned

Once the app was running, I showed it off to my husband. He clicked the buttons, tried a few different amounts, and gave it a test run with some imaginary sushi bills. No standing ovation, but he did mumble, “Hmm, not bad,” with just enough approval to make me smug.
Honestly, the hardest part wasn’t the math—it was spacing the widgets just right. Building GUIs is like setting a dinner table: all the pieces matter, and you’ll only notice when something is off.

Optional Ideas for Expansion

  • Add a dropdown for common tip amounts (10%, 15%, 20%)
  • Include a dark mode (because tip math deserves mood lighting)
  • Add a “copy to clipboard” button to paste payment amounts into your group chat