Кнопка запуска не работает в моей программе tkinter - PullRequest
0 голосов
/ 21 апреля 2020

В этой тренировочной программе я создал Цветную игру. В этом я создал кнопку под названием «Начать игру». Игра должна начаться только после того, как я нажму кнопку «Начать игру». Эта кнопка также исчезает при запуске игры. Работает отлично с первого раза. Но когда отсчет закончится или когда игрок проиграет, кнопка «Начать игру» должна появиться в том же месте. Кнопка «Пуск» появляется снова, но она вызывает функцию, как и должно быть. пожалуйста, кто-нибудь поможет?

from tkinter import *
from random import *

doc = open("Highscore.txt", "r")
us = 0
hs = int(doc.read())
time_count = 5
colorlist = ["Red", "Yellow", "Blue", "Green", "Orange", "Purple"]

def add_uscore():
    global us
    us+= 1
    score.config(text=(f"Score: {us}"))


def add_highscore():
    global us
    global hs
    if us>hs:
        hs = us
        highscore.config(text=(f"Highscore: {hs}"))
        doc2 = open("Highscore.txt","w")
        doc2.write(str(hs))
        doc2.close()


def start_game():
    global colorlist
    global textcolor
    rancolor = choice(colorlist)
    textcolor = choice(colorlist)
    start_btn.grid_forget()
    color.config(text=rancolor, fg=textcolor)
    btn1.config(state=ACTIVE, bg="Indian Red")
    btn2.config(state=ACTIVE, bg="Gold")
    btn3.config(state=ACTIVE, bg="DodgerBlue3")
    btn4.config(state=ACTIVE, bg="Sea Green")
    btn5.config(state=ACTIVE, bg="Dark Orange")
    btn6.config(state=ACTIVE, bg="Purple3")
    timer.grid(row=4, column=0, columnspan=3)


def countdown():
    global time_count
    if time_count > 0:
        time_count -= 1
        timer.config(text=(f"Countdown: {time_count}"))
        timer.after(1000, countdown)
    elif time_count==0:
        result.config(text="Time Over", fg="Indian Red")
        finish_game()


def finish_game():
    timer.grid_forget()
    start_btn.grid(row=4, column=0, columnspan=3)
    btn1.config(state=DISABLED)
    btn2.config(state=DISABLED)
    btn3.config(state=DISABLED)
    btn4.config(state=DISABLED)
    btn5.config(state=DISABLED)
    btn6.config(state=DISABLED)


def new_game():
    global us
    us = 0
    score.config(text=(f"Score: {us}"))
    finish_game()


def reset_game():
    global hs
    hs = 0
    doc2 = open("Highscore.txt","w")
    doc2.write(str(hs))
    doc2.close()
    new_game()


def check(ucolor):
    global textcolor
    global time_count
    if textcolor==ucolor:
        result.config(text="Good", fg="Sea Green")
        add_uscore()
        add_highscore()
        start_game()
        time_count = 5
    else:
        result.config(text="You Lose", fg="Indian Red")
        finish_game()



win = Tk()
win.title("Color Game")

#MENU
menu1 = Menu(win)
win.config(menu=menu1)

options = Menu(menu1)
menu1.add_cascade(label="Option", menu=options)
options.add_command(label="New Game", command=new_game)
options.add_command(label="Reset Game", command=reset_game)
options.add_command(label="Exit Game", command=quit)


#DISPLAY
color = Label(win, text="", font=("Comic Sans", 50), anchor=W)
color.grid(row=0, column=0, columnspan=4)

#BUTTON

btn1 = Button(win, text="Red", height=10, width=10, state=DISABLED, command=lambda:check("Red"))
btn1.grid(row=1, column=0)

btn2 = Button(win, text="Yellow", height=10, width=10,state=DISABLED, command=lambda:check("Yellow"))
btn2.grid(row=1, column=1)

btn3 = Button(win, text="Blue", height=10, width=10, state=DISABLED, command=lambda:check("Blue"))
btn3.grid(row=1, column=2)

btn4 = Button(win, text="Green", height=10, width=10, state=DISABLED, command=lambda:check("Green"))
btn4.grid(row=2, column=0)

btn5 = Button(win, text="Orange", height=10, width=10, state=DISABLED, command=lambda:check("Orange"))
btn5.grid(row=2, column=1)

btn6 = Button(win, text="Purple", height=10, width=10, state=DISABLED, command=lambda:check("Purple"))
btn6.grid(row=2, column=2)

#RESULT
result = Label(win, text="", font=("Ariel", 25))
result.grid(row=3, column=0, columnspan=3)

#COUNTDOWN
timer = Label(win, text="", fg="Dark Orange", font=("Ariel", 15))

#START BUTTON
start_btn = Button(win, text="START GAME", bg="Green", command= lambda: [start_game(), countdown()])
start_btn.grid(row=4, column=0, columnspan=3)

#SCORE
score = Label(win, text=(f"Score: {us}"), fg="Sea Green", font=("Ariel", 10))
score.grid(row=5, column=0, columnspan=3)

#HIGHSCORE
highscore = Label(win, text=(f"Highscore: {hs}"), font=("Ariel", 10), fg="firebrick4")
highscore.grid(row=6, column=0, columnspan=3)

win.mainloop()

1 Ответ

0 голосов
/ 21 апреля 2020

В вашем коде есть переменная time_count

Она установлена ​​как 5 в начале кода

...
hs = int(doc.read())
time_count = 5 # <-----------
colorlist = ["Red", "Yellow", "Blue", "Green", "Orange", "Purple"]
...

Когда у вас заканчивается время, time_count имеет значение 0. Когда вы снова вызываете функцию start_game, он видит, что time_count равен 0, и поэтому игра должна быть закончена. Чтобы это исправить, вам нужно будет сбросить time_count после каждого окончания игры. Как-то так у меня получилось:

def finish_game():
    global time_sleep
    time_sleep = 5
    timer.grid_forget()
    start_btn.grid(row=4, column=0, columnspan=3)
    btn1.config(state=DISABLED)
    btn2.config(state=DISABLED)
    btn3.config(state=DISABLED)
    btn4.config(state=DISABLED)
    btn5.config(state=DISABLED)
    btn6.config(state=DISABLED)

Редактировать:

Мне удалось исправить функцию countdown, выполняющуюся самостоятельно в фоновом режиме, добавив переменную gameover. Когда игра заканчивается, она устанавливается на 1, а когда игра начинается, она снова устанавливается на 0. Функция обратного отсчета проверяет gameover и выполняется только тогда, когда она установлена ​​на 0. Я также сделал так, чтобы метка result появлялась только по окончании игры.

Полный код:

from tkinter import *
from random import *

doc = open("Highscore.txt", "r")
us = 0
hs = int(doc.read())
time_count = 5
colorlist = ["Red", "Yellow", "Blue", "Green", "Orange", "Purple"]

def add_uscore():
    global us
    us+= 1
    score.config(text=(f"Score: {us}"))


def add_highscore():
    global us
    global hs
    if us>hs:
        hs = us
        highscore.config(text=(f"Highscore: {hs}"))
        doc2 = open("Highscore.txt","w")
        doc2.write(str(hs))
        doc2.close()


def start_game():
    global gameover
    global colorlist
    global textcolor
    gameover = 0
    rancolor = choice(colorlist)
    textcolor = choice(colorlist)
    start_btn.grid_forget()
    result.grid_forget()
    color.config(text=rancolor, fg=textcolor)
    btn1.config(state=ACTIVE, bg="Indian Red")
    btn2.config(state=ACTIVE, bg="Gold")
    btn3.config(state=ACTIVE, bg="DodgerBlue3")
    btn4.config(state=ACTIVE, bg="Sea Green")
    btn5.config(state=ACTIVE, bg="Dark Orange")
    btn6.config(state=ACTIVE, bg="Purple3")
    timer.grid(row=4, column=0, columnspan=3)


def countdown():
    global time_count
    if time_count > 0 and gameover != 1:
        time_count -= 1
        timer.config(text=(f"Countdown: {time_count}"))
        timer.after(1000, countdown)
    elif time_count==0:
        result.config(text="Time Over", fg="Indian Red")
        finish_game()


def finish_game():
    global time_count
    time_count = 5
    timer.grid_forget()
    result.grid(row=3, column=0, columnspan=3)
    start_btn.grid(row=4, column=0, columnspan=3)
    btn1.config(state=DISABLED)
    btn2.config(state=DISABLED)
    btn3.config(state=DISABLED)
    btn4.config(state=DISABLED)
    btn5.config(state=DISABLED)
    btn6.config(state=DISABLED)


def new_game():
    global us
    us = 0
    score.config(text=(f"Score: {us}"))
    finish_game()


def reset_game():
    global hs
    hs = 0
    doc2 = open("Highscore.txt","w")
    doc2.write(str(hs))
    doc2.close()
    new_game()


def check(ucolor):
    global textcolor
    global time_count
    global gameover
    if textcolor==ucolor:
        result.config(text="Good", fg="Sea Green")
        add_uscore()
        add_highscore()
        start_game()
        time_count = 5
    else:
        result.config(text="You Lose", fg="Indian Red")
        gameover = 1
        finish_game()



win = Tk()
win.title("Color Game")

#MENU
menu1 = Menu(win)
win.config(menu=menu1)

options = Menu(menu1)
menu1.add_cascade(label="Option", menu=options)
options.add_command(label="New Game", command=new_game)
options.add_command(label="Reset Game", command=reset_game)
options.add_command(label="Exit Game", command=quit)


#DISPLAY
color = Label(win, text="", font=("Comic Sans", 50), anchor=W)
color.grid(row=0, column=0, columnspan=4)

#BUTTON

btn1 = Button(win, text="Red", height=10, width=10, state=DISABLED, command=lambda:check("Red"))
btn1.grid(row=1, column=0)

btn2 = Button(win, text="Yellow", height=10, width=10,state=DISABLED, command=lambda:check("Yellow"))
btn2.grid(row=1, column=1)

btn3 = Button(win, text="Blue", height=10, width=10, state=DISABLED, command=lambda:check("Blue"))
btn3.grid(row=1, column=2)

btn4 = Button(win, text="Green", height=10, width=10, state=DISABLED, command=lambda:check("Green"))
btn4.grid(row=2, column=0)

btn5 = Button(win, text="Orange", height=10, width=10, state=DISABLED, command=lambda:check("Orange"))
btn5.grid(row=2, column=1)

btn6 = Button(win, text="Purple", height=10, width=10, state=DISABLED, command=lambda:check("Purple"))
btn6.grid(row=2, column=2)

#RESULT
result = Label(win, text="", font=("Ariel", 25))

#COUNTDOWN
timer = Label(win, text="", fg="Dark Orange", font=("Ariel", 15))

#START BUTTON
start_btn = Button(win, text="START GAME", bg="Green", command= lambda: [start_game(), countdown()])
start_btn.grid(row=4, column=0, columnspan=3)

#SCORE
score = Label(win, text=(f"Score: {us}"), fg="Sea Green", font=("Ariel", 10))
score.grid(row=5, column=0, columnspan=3)

#HIGHSCORE
highscore = Label(win, text=(f"Highscore: {hs}"), font=("Ariel", 10), fg="firebrick4")
highscore.grid(row=6, column=0, columnspan=3)

win.mainloop()

Обратите внимание, как метка result размещается только в менеджере сетки, когда игра заканчивается, и она удаляется, как только игра начинается снова:

Размещение метки result на .grid, когда игра заканчивается

def finish_game():
    ...
    result.grid(row=3, column=0, columnspan=3)
    ...

Удаление метки result с помощью .grid_forget когда начинается игра

def start_game():
    ...
    result.grid_forget()
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...