-1

I'm trying to code a calculator that helps us count what margins we need to buy and sell cars.

This is the code, I am not getting any error messages but a window does not pop up anyways.

import tkinter as tk
from tkinter import messagebox

# define base margins for different selling price ranges
BASE_MARGINS = {
    100000: 27500,
    200000: 32500,
    300000: 35000
}

# define costs for different expenses
EXPENSE_COSTS = {
    '1 panel lack': 2000,
    '2 paneler lack': 4000,
    '3 paneler lack': 6000,
    '4 paneler lack': 8000,
    'Saknar nyckel': 3000,
    'liten service': 4000,
    'stor service': 10000
}

class MarginCalculator(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.master.title("Margin calculator")
        self.create_widgets()
        self.master.deiconify()

    def create_widgets(self):
        # create widgets for selling price
        tk.Label(self.master, text="Selling price:").grid(row=0, column=0, sticky="W")
        self.selling_price_entry = tk.Entry(self.master)
        self.selling_price_entry.grid(row=0, column=1)

        # create widgets for expense options
        tk.Label(self.master, text="Expenses:").grid(row=1, column=0, sticky="W")
        self.expense_vars = {}
        for i, expense in enumerate(EXPENSE_COSTS):
            var = tk.BooleanVar()
            self.expense_vars[expense] = var
            tk.Checkbutton(self.master, text=expense, variable=var).grid(row=i+2, column=0, sticky="W")

        # create buttons for showing/hiding expense options and calculating margin
        self.show_button = tk.Button(self.master, text="Show expenses", command=self.show_expenses)
        self.show_button.grid(row=len(EXPENSE_COSTS)+2, column=0, sticky="W", padx=5, pady=5)
        self.hide_button = tk.Button(self.master, text="Hide expenses", command=self.hide_expenses, state=tk.DISABLED)
        self.hide_button.grid(row=len(EXPENSE_COSTS)+2, column=1, sticky="W", padx=5, pady=5)
        self.calculate_button = tk.Button(self.master, text="Calculate", command=self.calculate_margin)
        self.calculate_button.grid(row=len(EXPENSE_COSTS)+2, column=2, sticky="W", padx=5, pady=5)

        # create labels for displaying margin results
        tk.Label(self.master, text="Base margin:").grid(row=len(EXPENSE_COSTS)+3, column=0, sticky="W")
        self.base_margin_label = tk.Label(self.master, text="")
        self.base_margin_label.grid(row=len(EXPENSE_COSTS)+3, column=1, sticky="W")
        tk.Label(self.master, text="Expenses:").grid(row=len(EXPENSE_COSTS)+4, column=0, sticky="W")
        self.expenses_label = tk.Label(self.master, text="")
        self.expenses_label.grid(row=len(EXPENSE_COSTS)+4, column=1, sticky="W")
        tk.Label(self.master, text="Margin needed:").grid(row=len(EXPENSE_COSTS)+5, column=0, sticky="W")
        self.margin_needed_label = tk.Label(self.master, text="")
        self.margin_needed_label.grid(row=len(EXPENSE_COSTS)+5, column=1, sticky="W")
        tk.Label(self.master, text="Our offer:").grid(row=len(EXPENSE_COSTS)+6, column=0, sticky="W")
        self.our_offer_label = tk.Label(self.master, text="")
        self.our_offer_label.grid(row=len(EXPENSE_COSTS)+6, column=1, sticky="W")

    def show_expenses(self):
        self.show_button.config(state=tk.DISABLED)
        self.hide_button.config(state=tk.NORMAL)
        for expense, var in self.expense_vars.items():
            var.set(True)

    def hide_expenses(self):
        self.show_button.config(state=tk.NORMAL)
        self.hide_button.config(state=tk.DISABLED)
        for expense, var in self.expense_vars.items():
            var.set(False)

    def calculate_margin(self):
        # get selling price from entry
        try:
            selling_price = int(self.selling_price_entry.get())
        except ValueError:
            messagebox.showerror("Error", "Selling price must be a whole number")
            return

        # get expenses from checkboxes
        expenses = sum(EXPENSE_COSTS[expense] for expense, var in self.expense_vars.items() if var.get())

        # calculate base margin based on selling price
        base_margin = 0
        for price, margin in BASE_MARGINS.items():
            if selling_price <= price:
                base_margin = margin
                break

        # calculate margin needed and our offer
        margin_needed = selling_price - base_margin
        our_offer = selling_price - base_margin - expenses

        # update labels with results
        self.base_margin_label.config(text=f"{base_margin} SEK")
        self.expenses_label.config(text=f"{expenses} SEK")
        self.margin_needed_label.config(text=f"{margin_needed} SEK")
        self.our_offer_label.config(text=f"{our_offer} SEK")

def main():
    root = tk.Tk()
    MarginCalculator(root).pack()
    root.geometry("400x400+100+100") 
    root.mainloop()

I've tried everything I could think of. Even asked Chat GPT to fix the problem but it told me everything should be ok.

Christian
  • 4,902
  • 4
  • 24
  • 42
  • Does this answer your question? [Why doesn't the main() function run when I start a Python script? Where does the script start running (what is its entry point)?](https://stackoverflow.com/questions/17257631/why-doesnt-the-main-function-run-when-i-start-a-python-script-where-does-the) – 001 Mar 08 '23 at 15:17
  • Thanks for your fast answears, the problem was that i had put app.pack() in the end instead of app.grid() – Marcus Skeie Mar 08 '23 at 15:25
  • Actually you don't need to call any layout function on `MarginCalculator(root)` because it doesn't have any child and so it is a frame of size 1x1. All the widgets created inside the class are actually children of `root`. I wonder why you have such design. – acw1668 Mar 10 '23 at 03:24

1 Answers1

-1

In line 108.

Change this:

MarginCalculator(root).pack()

to:

MarginCalculator(root)
MarginCalculator.pack() 

Add this to line 112.

if __name__=='__main__':
    main()  

Screenshot:

enter image description here

toyota Supra
  • 3,181
  • 4
  • 15
  • 19