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()