# 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()
# 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)
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
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")
class UnifiedApp:
def init(self, root):
self.root = root
self.root.title("Unified Tracker App")
self.root.geometry("400x600")
class RomanHistoryApp:
def init(self, parent):
self.parent = parent
self.history = {roman: [] for roman in self.get_roman_numerals()}
self.create_widgets()
Glavni deo aplikacije
if name == "main":
root = tk.Tk()
app = RomanClockApp(root)
root.mainloop()