Skip to content

22 #2

Description

@Iksandejantadic

import tkinter as tk
import math

class RomanClockApp:
def init(self, root):
self.root = root
self.root.title("Roman Numeral Clock")
self.root.geometry("700x900")

    # Kreiramo platno
    self.canvas = tk.Canvas(self.root, width=650, height=650, bg="#d3d3d3", bd=0, highlightthickness=0)
    self.canvas.pack()

    # Koordinate centra platna
    self.center_x = 300
    self.center_y = 300
    self.radius = 200 * 1.3  # Poluprečnik kruga

    # Crtanje kruga
    self.canvas.create_oval(self.center_x - self.radius, self.center_y - self.radius,
                            self.center_x + self.radius, self.center_y + self.radius,
                            outline="black", width=2)

    # Rimski brojevi (sada 16 brojeva)
    self.roman_numbers = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII',
                          'IX', 'X', 'XI', 'XII', 'XIII', 'XIV', 'XV', 'XVI']
    self.roman_positions = {}

    # Definisanje boja za kocke
    self.colors = ["#FF6347", "#ADFF2F", "#FFD700", "#00BFFF", "#8A2BE2", "#A52A2A", "#FF1493", "#32CD32"]
    self.roman_to_color = {
        'II': self.colors[0], 'IV': self.colors[1], 'VI': self.colors[2], 'VIII': self.colors[3],
        'X': self.colors[4], 'XII': self.colors[5], 'XIV': self.colors[6], 'XVI': self.colors[7]
    }

    # Raspored rimskih brojeva na satu
    for i in range(len(self.roman_numbers)):
        angle = math.radians(360 * i / 16)  # Izračunavanje ugla za svaku poziciju

        x = self.center_x + self.radius * math.sin(angle)
        y = self.center_y - self.radius * math.cos(angle)

        roman = self.roman_numbers[i]
        self.roman_positions[roman] = (x, y)

        # Crtanje kocke oko brojeva 2, 4, 6, 8, 10, 12, 14, 16 sa odgovarajućim bojama
        if roman in self.roman_to_color:
            color = self.roman_to_color[roman]
            self.canvas.create_rectangle(x - 30, y - 30, x + 30, y + 30, fill=color, outline="black")
            self.canvas.create_text(x, y, text=roman, font=("Arial", 8, "bold"))
        else:
            self.canvas.create_text(x, y, text=roman, font=("Arial", 10, "bold"))

    # Aktivni rimski broj
    self.active_roman = None

    # Skladište brojeva za svaki rimski broj (lista pozicija)
    self.numbers_at_roman = {roman: [] for roman in self.roman_numbers}

    # Lista za istoriju brojeva
    self.history = []

    # Kreiranje dugmadi za rimske brojeve
    self.create_roman_buttons()

    # Kreiranje dugmadi za obične brojeve (36 + 0)
    self.create_number_buttons()

    # Kreiranje dugmeta za restart
    self.create_restart_button()

class UnifiedApp:
def init(self, root):
self.root = root
self.root.title("Unified Tracker App")
self.root.geometry("400x600")

    # First program interface (top section)
    self.entries = []
    self.history = []
    self.result_label = tk.Label(self.root, text="", font=("Arial", 6))
    self.result_label.pack(pady=5)

    self.history_frame = tk.Frame(self.root)
    self.history_frame.pack(pady=5)

    self.last_22_frame = tk.Frame(self.root)
    self.last_22_frame.pack(pady=5)

    self.last_22_table = []
    for row in range(2):
        row_list = []
        for col in range(11):
            label = tk.Label(self.last_22_frame, text="", width=3, height=1, font=("Arial", 6), relief="solid", anchor="center")
            label.grid(row=row, column=col, padx=1, pady=1)
            row_list.append(label)
        self.last_22_table.append(row_list)

    # Second program interface (bottom section)
    self.poslednjih_sedam = deque(maxlen=7)

    self.brojevi_frame = tk.Frame(self.root)
    self.brojevi_frame.pack(pady=1)

    self.rezultat = tk.StringVar()
    self.rezultat.set("Result.")
    self.label_rezultat = tk.Label(self.root, textvariable=self.rezultat, font=("Arial", 6))
    self.label_rezultat.pack(pady=5)

    # Five number squares
    self.kvadrati_frame = tk.Frame(self.root)
    self.kvadrati_frame.pack(pady=10)

    self.kvadrati = []
    for i in range(8):
        kvadrat = tk.Label(self.kvadrati_frame, text="", font=("Arial", 10), width=3, height=1, relief="solid", bg="white")
        kvadrat.pack(side=tk.LEFT, padx=3)
        self.kvadrati.append(kvadrat)

    # Buttons for numbers 1-36 (0 if needed)
    self.buttons_frame = tk.Frame(self.root)
    self.buttons_frame.pack(pady=5)

    # Create number buttons from 1 to 36
    self.buttons = {}
    for i in range(1, 37):  # Buttons from 1 to 36
        button = tk.Button(self.buttons_frame, text=str(i), font=("Arial", 6), width=3, height=1,
                           command=lambda i=i: self.process_number(i))
        button.grid(row=(i-1) // 6, column=(i-1) % 6, padx=1, pady=1)
        self.buttons[i] = button


def create_roman_buttons(self):
    roman_frame = tk.Frame(self.root)
    roman_frame.pack(side="bottom", pady=(10, 5))  # Premestili smo dugmadi na dno ekrana

    # Horizontalni raspored dugmadi za 16 rimskih brojeva (smanjena širina)
    for i in range(8):  # Prvi red (8 brojeva)
        font_size = 10
        color = self.roman_to_color.get(self.roman_numbers[i], "white")  # Boja pozadine dugmadi
        if self.roman_numbers[i] in ['II', 'IV', 'VI', 'VIII', 'X', 'XII', 'XIV', 'XVI']:
            font_size = 8  # Smanjenje fonta za 20% u dugmadima
        button = tk.Button(roman_frame, text=self.roman_numbers[i],
                           command=lambda r=self.roman_numbers[i]: self.select_roman(r), width=1, height=1,
                           font=("Arial", font_size, "bold"), bg=color)
        button.grid(row=0, column=i, padx=3, pady=5)

    for i in range(8, 16):  # Drugi red (8 brojeva)
        font_size = 10
        color = self.roman_to_color.get(self.roman_numbers[i], "white")  # Boja pozadine dugmadi
        if self.roman_numbers[i] in ['II', 'IV', 'VI', 'VIII', 'X', 'XII', 'XIV', 'XVI']:
            font_size = 8  # Smanjenje fonta za 20% u dugmadima
        button = tk.Button(roman_frame, text=self.roman_numbers[i],
                           command=lambda r=self.roman_numbers[i]: self.select_roman(r), width=1, height=1,
                           font=("Arial", font_size, "bold"), bg=color)
        button.grid(row=1, column=i - 8, padx=3, pady=5)

def create_number_buttons(self):
    number_frame = tk.Frame(self.root)
    number_frame.pack(side="bottom", pady=(10, 10))  # Premestili smo dugmadi na dno ekrana

    # Dodajemo dugme za broj 0
    zero_button = tk.Button(number_frame, text="0", command=lambda: self.place_number(0), width=2, height=1, relief="raised")
    zero_button.grid(row=0, column=2, padx=5, pady=5)

    # Dodajemo brojeve od 1 do 36 u 6x6 rasporedu
    row = 1
    col = 0
    for i in range(1, 37):  # Brojevi od 1 do 36
        button = tk.Button(number_frame, text=str(i), command=lambda n=i: self.place_number(n), width=2, height=1, relief="raised")
        button.grid(row=row, column=col, padx=5, pady=5)

        col += 1
        if col == 6:  # Prelazak u novi red nakon 6 kolona
            col = 0
            row += 1

def select_roman(self, roman):
    """Postavlja aktivni rimski broj."""
    self.active_roman = roman
    print(f"Odabrani rimski broj: {roman}")

def place_number(self, number):
    """Postavlja broj ka centru do odabranog rimskog broja i prati prethodne brojeve."""
    if self.active_roman is not None:
        x, y = self.roman_positions[self.active_roman]

        # Provera ako je već postavljen broj na ovom rimskom broju
        numbers = self.numbers_at_roman[self.active_roman]

        # Ako je to prvi broj za ovaj rimski broj
        if len(numbers) == 0:
            move_distance = 30  # Prvi broj ide sa malim razmakom
            first_x = self.center_x + (x - self.center_x) * 0.85  # Pomeranje broja unutar kruga
            first_y = self.center_y + (y - self.center_y) * 0.85
            number_tag = self.canvas.create_text(first_x, first_y, text=str(number), font=("Arial", 7), fill="blue")
            self.numbers_at_roman[self.active_roman].append(number_tag)
        else:
            # Sledeći brojevi idu dalje sa većim razmakom
            last_number_position = numbers[-1]
            last_x, last_y = self.canvas.coords(last_number_position)

            direction_x = self.center_x - last_x
            direction_y = self.center_y - last_y
            distance = math.sqrt(direction_x ** 2 + direction_y ** 2)

            move_distance = 40  # Veći razmak za sledeće brojeve
            new_x = last_x + (direction_x / distance) * move_distance
            new_y = last_y + (direction_y / distance) * move_distance

            number_tag = self.canvas.create_text(new_x, new_y, text=str(number), font=("Arial", 7), fill="blue")
            self.numbers_at_roman[self.active_roman].append(number_tag)

        # Dodavanje broja u istoriju
        self.history.append(number)
        if len(self.history) > 22:  # Zadržavamo samo poslednjih 22 broja
            self.history.pop(0)

        # Ažuriranje malih displeja
        self.update_small_displays()

        # Ažuriranje prethodnog, trenutnog i sledećeg broja
        self.update_history_fields()

        # Ako je broj 4 postavljen, brišemo prvi broj
        if len(self.numbers_at_roman[self.active_roman]) > 4:
            first_number_tag = self.numbers_at_roman[self.active_roman].pop(0)
            self.canvas.delete(first_number_tag)

        print(f"Postavljen broj {number} ispod rimskog broja {self.active_roman}")
    else:
        print("Nije odabran rimski broj!")

# First Program: Processing numbers in sequence
def process_first_program(self, number):
    if number in self.entries:
        prev_number = self.entries[self.entries.index(number) - 1] if self.entries.index(number) > 0 else None
        next_number = self.entries[self.entries.index(number) + 1] if self.entries.index(number) < len(self.entries) - 1 else None
        self.history = [f"{prev_number}-{number}-{next_number}"]
        self.result_label.config(text=f"Ponovljen: {number}")
        self.update_history()
        self.first_program_result = (prev_number, number, next_number)
    else:
        self.entries.append(number)
        self.result_label.config(text=f"Unesen: {number}")
        self.first_program_result = (None, None, None)
    self.update_last_22()

# Update the history display
def update_history(self):
    for widget in self.history_frame.winfo_children():
        widget.destroy()
    for interval in self.history:
        label = tk.Label(self.history_frame, text=interval, font=("Arial", 8))
        label.pack(pady=1)  # smanjen pady ovde

# Update the last 22 numbers display
def update_last_22(self):
    for row in self.last_22_table:
        for label in row:
            label.config(text="")  # Reset all numbers
    last_22_numbers = self.entries[-22:]  # Shows last 22 numbers
    row = 0
    col = 0
    for number in last_22_numbers:
        self.last_22_table[row][col].config(text=str(number))
        col += 1
        if col == 11:
            row += 1
            col = 0

# Second Program: Processing the last seven numbers
def process_second_program(self, number):
    self.poslednjih_sedam.append(number)
    self.osvezi_prikaz()

    obrnut_redosled = list(reversed(self.poslednjih_sedam))
    if len(obrnut_redosled) >= 4:
        # Process third and fourth numbers internally, not shown
        treci_broj = obrnut_redosled[2]
        cetvrti_broj = obrnut_redosled[3]
        self.second_program_result = (treci_broj, cetvrti_broj)
    else:
        self.second_program_result = (None, None)

# Refresh display of last 7 numbers
def osvezi_prikaz(self):
    for widget in self.brojevi_frame.winfo_children():
        widget.destroy()
    for broj in reversed(self.poslednjih_sedam):
        kvadrat = tk.Label(self.brojevi_frame, text=broj, font=("Arial", 10), width=3, height=2, relief="solid", bg="lightgray")
        kvadrat.pack(side=tk.LEFT, padx=3)

# Update the number squares at the bottom
def update_kvadrati(self):
    first_program_numbers = self.first_program_result  # Neighboring numbers from the first program
    second_program_numbers = self.second_program_result  # Neighboring numbers from the second program

    numbers_to_show = [first_program_numbers[0], first_program_numbers[1], first_program_numbers[2]]
    numbers_to_show += second_program_numbers

    for i in range(len(numbers_to_show)):
        self.kvadrati[i].config(text=str(numbers_to_show[i]) if numbers_to_show[i] is not None else "")

# Processing Roman numeral button clicks
def process_roman_number(self, roman):
    self.roman_history_app.add_to_history(roman)

class RomanHistoryApp:
def init(self, parent):
self.parent = parent
self.history = {roman: [] for roman in self.get_roman_numerals()}
self.create_widgets()

def get_roman_numerals(self):
    return ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII"]

def to_upper_roman(self, roman):
    """Convert Roman numeral to uppercase"""
    return roman.upper()

def get_surrounding_numerals(self, current):
    roman_numerals = self.get_roman_numerals()
    index = roman_numerals.index(current)
    prev_1 = roman_numerals[(index - 1) % 12]
    prev_2 = roman_numerals[(index - 2) % 12]
    next_1 = roman_numerals[(index + 1) % 12]
    next_2 = roman_numerals[(index + 2) % 12]
    return prev_2, prev_1, next_1, next_2



def restart(self):
    """Funkcija za brisanje svih postavljenih brojeva."""
    for roman in self.roman_numbers:
        for number_tag in self.numbers_at_roman[roman]:
            self.canvas.delete(number_tag)  # Brišemo sve brojeve sa platna
        self.numbers_at_roman[roman] = []  # Resetujemo listu brojeva za svaki rimski broj
    self.history.clear()  # Brišemo istoriju brojeva
    self.update_small_displays()  # Ažuriramo displeje
    self.update_history_fields()  # Ažuriramo polja za prethodni, trenutni i sledeći broj
    print("Svi brojevi su resetovani.")

def create_restart_button(self):
    """Kreiranje dugmeta za Restart."""
    restart_button = tk.Button(self.root, text="Restart", command=self.restart, bg="#d3d3d3", fg="black", relief="raised", width=8, height=1)
    restart_button.pack(side="bottom", pady=10)  # Dugme za restart je takođe premesteno na dno

Glavni deo aplikacije

if name == "main":
root = tk.Tk()
app = RomanClockApp(root)
root.mainloop()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions