Не работает игра "виселица" на python tkinter
У меня не работает нормально игра "виселица" на python tkinter.
После нажатия на кнопку "играть снова" не работает отгадывание букв и победа.
import random
from tkinter import *
#Constant
Window_width=1200
Window_height=700
bg_colour='white'
# bg_colour=open('bgIMAGE.jpg')
lines_colour="black"
TXT_colour="black"
BTN_colour='white'
res_colour='red'
label_word=[]
btn_abc=[]
er=[]
find_let=[]
MARGIN=100
def game():
def start_pos_man():
line_1 = canvas.create_line(MARGIN, MARGIN, MARGIN, Window_height - MARGIN, width=4, fill=lines_colour)
line_2 = canvas.create_line(MARGIN, MARGIN, Window_width // 3, MARGIN, width=4, fill=lines_colour)
line_3 = canvas.create_line(Window_width // 3, MARGIN, Window_width // 3, MARGIN * 2, width=4, fill=lines_colour)
def abc():
shift_x = shift_y = 0
count = 0
for i in range(ord("А"), ord("Я") + 1):
btn = Button(text=chr(i), bg=BTN_colour, foreground=TXT_colour, font="Arial",)
btn.place(x=Window_height - MARGIN + shift_x, y=MARGIN * 4.5 - shift_y)
btn.bind('<Button-1>', lambda event: check_abc(event, word))
btn_abc.append(btn)
shift_x += 50
count += 1
if (count == 8):
shift_x = count = 0
shift_y -= 50
def start_word(): # перебираем и выбираем слово
f = open('words', encoding='utf-8')
count = 0
for s in f:
count += 1
num_word = random.randint(1, count)
word = ''
count = 0
f = open('words', encoding='utf-8')
for s in f:
count += 1
if count == num_word:
word = s[:len(s) - 1:]
word = word.upper()
# print(word)
return word
def start_pos_word(word): # поле ввода
shift = 0
for i in range(len(word)):
label_under = Label(window, text="___", bg=bg_colour, font='bold')
label_under.place(x=Window_height - MARGIN + 1.1 + shift, y=MARGIN * 3)
shift += 50
label_word.append(label_under)
def draw(lifes): # hangman
if (lifes == 6):
head = canvas.create_oval(Window_width // 3 - 60, MARGIN * 1.5, Window_width // 3 + 60, MARGIN * 2.5,
fill=lines_colour)
elif (lifes == 5):
body = canvas.create_line(Window_width // 3, MARGIN * 2.5, Window_width // 3, MARGIN * 4, width=4,
fill=lines_colour)
elif lifes == 4:
hand_1 = canvas.create_line(Window_width // 3, MARGIN * 2.5, Window_width // 3 - 30, MARGIN * 3.5, width=4,
fill=lines_colour)
elif lifes == 3:
hand_2 = canvas.create_line(Window_width // 3, MARGIN * 2.5, Window_width // 3 + 30, MARGIN * 3.5, width=4,
fill=lines_colour)
elif lifes == 2:
leg_1 = canvas.create_line(Window_width // 3, MARGIN * 4, Window_width // 3 - 30, MARGIN * 5, width=4,
fill=lines_colour)
elif lifes == 1:
leg_2 = canvas.create_line(Window_width // 3, MARGIN * 4, Window_width // 3 + 30, MARGIN * 5, width=4,
fill=lines_colour)
game_over('lose')
def check_abc(event, word):
count_abc = 0
letter = event.widget['text']
pos = []
for i in range(len(word)):
if (word[i] == letter):
event.widget['bg'] = 'green'
pos.append(i)
if len(pos) != 0:
for i in pos:
label_word[i].config(text='{}'.format(word[i]), font='Arial 20')
for i in label_word:
if i['text'].isalpha():
count_abc += 1
if count_abc == len(word):
game_over('win')
else:
lifes = int(label_life.cget('text'))
label_life.config(text='{}'.format(lifes - 1))
event.widget['bg'] = 'red'
if lifes == 0:
game_over('lose')
draw(lifes)
pos=[]
def game_over(status):
def change1():
win_window.destroy()
window.destroy()
def change11():
win_window.destroy()
window.destroy()
game()
start_pos_man()
abc()
word = start_word()
start_pos_word(word)
def change2():
loose_window.destroy()
window.destroy()
def change22():
loose_window.destroy()
window.destroy()
game()
word = start_word()
start_pos_word(word)
if status == 'win':
win_window = Tk()
win_window.title("WIN")
win_window.resizable(False, False)
canvas_win = Canvas(win_window, bg=bg_colour, height=780, width=Window_width)
canvas_win.place(x=0, y=0)
canvas_win.create_text(canvas.winfo_width() / 2, canvas.winfo_height() / 2, font=("Futura PT Heave", 50),
text='ПОБЕДА!',fill=res_colour) # winfo_width и winfo_height: текущая ширина и высота виджета
canvas_win.create_text(Window_height - MARGIN, MARGIN * 3, font=("Futura PT Heave", 40), text=("слово: "+word),
fill='black')
close_button = Button(win_window, text="Завершить игру", bg=BTN_colour, foreground=TXT_colour, font="Arial", command=change1)
close_button.place(x=400, y=MARGIN * 4.5)
again_button = Button(win_window, text="Играть снова", bg=BTN_colour, foreground=TXT_colour, font="Arial",
command=change11)
again_button.place(x=600, y=MARGIN * 4.5)
win_window.geometry("1200x780")
win_window.mainloop()
else:
loose_window = Tk()
loose_window.title("LOOSE")
loose_window.resizable(False, False)
canvas_loose = Canvas(loose_window, bg=bg_colour, height=780, width=Window_width)
canvas_loose.place(x=0, y=0)
canvas_loose.create_text(canvas.winfo_width() - 400, canvas.winfo_height() - 300,
font=("Futura PT Heave", 50),
text='ВЫ ПРОИГРАЛИ', fill=res_colour)
canvas_loose.create_text(Window_height - MARGIN, MARGIN * 3, font=("Futura PT Heave", 40), text=("слово: "+word),
fill='black')
close_button = Button(loose_window,text="Завершить игру", bg=BTN_colour, foreground=TXT_colour, font="Arial", command = change2)
close_button.place(x=400, y=MARGIN * 4.5)
again_button = Button(loose_window, text="Играть снова", bg=BTN_colour, foreground=TXT_colour, font="Arial",
command=change22)
again_button.place(x=600, y=MARGIN * 4.5)
loose_window.geometry("1200x780")
loose_window.mainloop()
window = Tk()
window.title("HANGMAN")
window.resizable(False, False)
canvas = Canvas(window, bg=bg_colour, height=Window_height, width=Window_width)
canvas.place(x=0, y=80)
window.geometry("1200x780")
lifes = 6
label_text = Label(window, text="Жизни: ", font=("Futura PT Heave", 40), foreground=TXT_colour)
label_text.place(x=930, y=10)
label_life = Label(window, text='{}'.format(lifes), font=("Futura PT Heave", 40), foreground=TXT_colour)
label_life.place(x=1110, y=10)
start_pos_man()
abc()
word = start_word()
start_pos_word(word)
window.mainloop()
game()
word=''