Рейтинг  

Яндекс.Метрика
Яндекс цитирования
 

   

Статистика  

Пользователи
7
Материалы
578
Кол-во просмотров материалов
2742806
   
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()

   
   

Login Form