from tkinter import *
from tkinter.messagebox import OK, INFO, ERROR, WARNING, showinfo
from random import choice, randint, shuffle
from math import sin, cos, radians
W, H, T = 350, 300, 100
kx, ky, kd = 20, 70, 200 # x, y круга и диаметр
kr = kd // 2 # радиус круга
kr_num = kr - 18 # радиус цифр на круге
font_num = ('', 15)
font_lebel = ('', 12)
font_text = ('', 20)
kxc, kyc = kx + kr, ky + kr # центр круга
diff = 8 # корректор расположения цифр на круге
secd = 20 # угол одного сектора
angle_d = -5 # дельта угла - на сколько градусов и в какую сторону сдвигать сектора
trid = 45 # 'длина' треугольника
#colors = ["Red", "Orange", "LightGreen", "LightBlue", "Pink", "Fuchsia", "Yellow"]
colors = ["Red", "Black"]
color_num = "White" #"Black"
rotate_stop_count = 20
rotate_stop = False
num_under_tri = -1
user_num = 0
def get_num_x(angle):
return kxc + cos(radians(angle + secd // 2)) * kr_num - diff
def get_num_y(angle):
return kyc - sin(radians(angle + secd // 2)) * kr_num - diff
def roulette_spin_step():
global num_under_tri
for num in range(len(sectors)):
sector = sectors[num] # сектор
angle = angles[num] + angle_d
#if angle >= 360:
# angle = angle - 360
if angle <= 0:
angle = 360 + angle
angles[num] = angle
can.itemconfig(sector, start=angles[num])
number = numbers[num]
# if (angle < secd // 2) or (angle > (360 - secd // 2)):
if angle > (360 - secd):
num_under_tri = nums[num]
k2x = get_num_x(angle)
k2y = get_num_y(angle)
can.moveto(number, x=k2x, y=k2y)
def roulette_rotate():
global rotate_stop_count
if rotate_stop:
if rotate_stop_count > 0:
roulette_spin_step()
can.itemconfig(txt_num, text=num_under_tri)
if rotate_stop_count < 2:
print(user_num, num_under_tri)
print(type(user_num), type(num_under_tri))
if user_num == num_under_tri:
showinfo(title="Результат",
message="Ты ВЫИГРАЛ!",
detail="!!! WIN !!!",
icon=INFO,
default=OK)
else:
showinfo(title="Результат",
message="Ты НЕ выиграл!",
detail=f"Загадали: {user_num}, Выпало: {num_under_tri}",
icon=ERROR, # WARNING,
default=OK)
rotate_stop_count -= 1
else:
return
else:
roulette_spin_step() # вращаем
win.after(T, roulette_rotate)
def roulette_start():
global rotate_stop, user_num
rotate_stop_count = 20
rotate_stop = False
user_num = pole_in2.get()
win.after(T, roulette_rotate)
def roulette_stop():
global rotate_stop, rotate_stop_count
rotate_stop_count = randint(20, 100)
rotate_stop = True
win = Tk()
win.title("Рулетка")
can = Canvas(win, width=W, height=H, bg="lightcyan")
sectors = []
numbers = []
angles = []
nums = []
num = 0
nums = list(map(str, range(360 // secd))) # Номера - числа
shuffle(nums)
for angle in range(0, 360, secd):
sector = can.create_arc(kx, ky, kx + kd, ky + kd, start=angle, extent=secd, width=2, outline="White", fill=colors[num % 2])
sectors.append(sector)
k2x = get_num_x(angle)
k2y = get_num_y(angle)
number = can.create_text(k2x, k2y, text=nums[num], font=font_num, fill=color_num, anchor=CENTER)
numbers.append(number) # Номера - объекты
angles.append(angle) # Углы стартовые
num += 1
triangle = can.create_polygon( \
kx + kd - trid // 3, ky + kr,
kx + kd + trid // 2, ky + kr - trid // 2,
kx + kd + trid // 2, ky + kr + trid // 2,
width=3, outline="Blue", fill="Yellow")
txt = can.create_text(W - 10, 10, font=font_text, text="Русская Рулетка", anchor=NE)
txt_num = can.create_text(W - 10, 50, font=font_text, text="Выиграл номер", anchor=NE)
lab_in1 = Label(text="Введите данные:", font=font_lebel)
lab_in2 = Label(text="Ставим на число:", font=font_lebel)
pole_in2 = Entry(width = 4, font=font_text)
pole_in2.insert(0, "17")
btn_start = Button(text="СТАРТ", font=font_num, command=roulette_start)
btn_stop = Button(text="СТОП", font=font_num, command=roulette_stop)
can.grid( row=0, column=0, rowspan=5)
lab_in1.grid( row=0, column=1, padx=10)
lab_in2.grid( row=1, column=1, padx=10)
pole_in2.grid( row=2, column=1, padx=10)
btn_start.grid(row=3, column=1)
btn_stop.grid( row=4, column=1)
#win.after(T, roulette_rotate)
#win.bind('<Key>', roulette_stop)
win.resizable(0, 0)
win.wm_attributes("-topmost", 1)
win.mainloop()