Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как сделать так что бы функция выполнялась без закрытия окна tkinter в python

YarinMinecraft YT Ученик (159), на голосовании 1 месяц назад
У меня есть код:
 import time 
import tkinter
import random
from tkinter import *
from tkinter import ttk

words = ["python", "hello", "test", "developer"]
python = ["p", "y", "t", "h", "o", "n"]
hello = ["h", "e", "l", "l", "o"]
test = ["t", "e", "s", "t"]
developer = ["d", "e", "v", "e", "l", "o", "p", "e", "r"]
chasti = 0

canvas = Canvas(bg="white", width=700, height=700)

def game_over():
print("Ой! Похоже вы проиграли((((")
q = input("Играть заново? [д/н]: ")
if q == "д":
game()
elif q == "н":
exit(0)
else:
exit(-1)
def init_graphic():
win = Tk()
win.title("Viseletsa")
win.geometry("700x700")
canvas.pack(anchor=CENTER, expand=1)
win.mainloop()


def question():
user = input("\nНапишите букву которая может быть в этом слове: ")
if len(user) > 1:
print("Ай-яй-яй-яй-яй, нельзя жульничать")
question()
elif len(user) == 0:
question()
else:
global chasti
global canvas
chasti += 1
match chasti:
case 1:
canvas.create_oval(40, 17, 70, 49) # Голова
case 2:
canvas.create_line(50, 50, 50, 100) # Тело
case 3:
canvas.create_line(51, 100, 36, 112) # Левая нога
case 4:
canvas.create_line(50, 100, 60, 115) # Правая нога
case 5:
canvas.create_line(51, 64, 36, 73) # Левая рука
case 6:
canvas.create_line(49, 64, 63, 73) # Правая рука
game_over()

def game():
random_word = words[random.randint(0, 3)]
print("Приветствуем вас в игре 'Виселица'!")
input()
print("Для начала я загадаю слово...")
time.sleep(5)
print("Слово загадано!")
init_graphic()
user = input("\nНапишите букву которая может быть в этом слове: ")
if len(user) > 1:
print("Ай-яй-яй-яй-яй, нельзя жульничать")
question()
elif len(user) == 0:
question()
else:
if user in random_word:
print(f"Первая буква угаданна! Это буква: {user}")
else:
global chasti
global canvas
chasti += 1
match chasti:
case 1:
canvas.create_oval(40, 17, 70, 49) # Голова
case 2:
canvas.create_line(50, 50, 50, 100) # Тело
case 3:
canvas.create_line(51, 100, 36, 112) # Левая нога
case 4:
canvas.create_line(50, 100, 60, 115) # Правая нога
case 5:
canvas.create_line(51, 64, 36, 73) # Левая рука
case 6:
canvas.create_line(49, 64, 63, 73) # Правая рука
game_over()


if __name__ == "__main__":
game()
И мне нужно сделать так, что бы у меня запрашивало букву не при закрытии окна tkinter, а во время того как оно открыто?
Голосование за лучший ответ
Татьяна Просветленный (36390) 2 месяца назад
 import tkinter as tk 
import random


class HangmanGame:
def __init__(self, master):
self.master = master
self.master.title("Виселица")
self.master.geometry("400x400")
self.master.resizable(False, False)

self.words = {
"python": ["p", "y", "t", "h", "o", "n"],
"hello": ["h", "e", "l", "l", "o"],
"test": ["t", "e", "s", "t"],
"developer": ["d", "e", "v", "e", "l", "o", "p", "e", "r"]
}

self.chasti = 0
self.random_word = random.choice(list(self.words.keys()))
self.word_letters = self.words[self.random_word]
self.guessed_letters = []

# Размещаем элементы интерфейса с помощью grid для компактного и аккуратного размещения
self.label = tk.Label(master, text="Угадайте букву:")
self.label.grid(row=0, column=0, columnspan=2, pady=10)

self.entry = tk.Entry(master)
self.entry.grid(row=1, column=0)

self.submit_btn = tk.Button(
master, text="Отправить", command=self.check_letter)
self.submit_btn.grid(row=1, column=1)

self.label_word = tk.Label(master, text="_ " * len(self.random_word))
self.label_word.grid(row=2, column=0, columnspan=2, pady=10)

self.canvas = tk.Canvas(master, bg="white", width=300, height=300)
self.canvas.grid(row=3, column=0, columnspan=2, pady=20)

# Функции отрисовки частей тела
self.draw_funcs = [
lambda: self.canvas.create_oval(120, 20, 180, 80),
lambda: self.canvas.create_line(150, 80, 150, 160),
lambda: self.canvas.create_line(150, 160, 130, 200),
lambda: self.canvas.create_line(150, 160, 170, 200),
lambda: self.canvas.create_line(150, 100, 120, 130),
lambda: self.canvas.create_line(150, 100, 180, 130)
]

self.update_label("Игра начинается... Я загадал слово.")
self.master.after(2000, self.update_label, "Начнем игру!")

def update_label(self, text):
self.label.config(text=text)

def game_over(self):
self.update_label("Ой! Вы проиграли.")
# Блокируем ввод после проигрыша
self.submit_btn.config(state=tk.DISABLED)

def check_letter(self):
user_input = self.entry.get().strip().lower()
self.entry.delete(0, tk.END)

if len(user_input) != 1 or not user_input.isalpha():
self.update_label("Введите одну букву.")
return

if user_input in self.guessed_letters:
self.update_label(f"Буква '{user_input}' уже была.")
return

self.guessed_letters.append(user_input)

if user_input in self.word_letters:
self.update_label(f"Буква '{user_input}' угадана!")
self.update_word_display(user_input)
else:
self.chasti += 1
if self.chasti <= len(self.draw_funcs):
self.draw_funcs[self.chasti - 1]() # Отрисовываем часть тела
if self.chasti == 6:
self.game_over()

def update_word_display(self, letter):
display_word = [
letter if letter in self.guessed_letters else "_" for letter in self.random_word
]
self.label_word.config(text=" ".join(display_word))

if "_" not in display_word:
self.update_label("Поздравляем! Вы угадали слово.")
# Блокируем ввод после победы
self.submit_btn.config(state=tk.DISABLED)


if __name__ == "__main__":
root = tk.Tk()
game = HangmanGame(root)
root.mainloop()
YarinMinecraft YTУченик (159) 2 месяца назад
Спасибо конечно, но я теперь сам не понимаю этого кода ???
Похожие вопросы