Я написал код, который генерирует два числа и просит пользователя вычислить его сумму и ввести результат. Программа работает нормально, но я хочу добавить кнопку, которая снова просит пользователя ввести результат и проверить это. Проблема, с которой я сталкиваюсь, заключается в том, что запись не очищается, и под исходным окном открывается другое окно с той же записью.

import tkinter as tk
import random
window = tk.Tk()
content = tk.StringVar()
def startgame():
    number1 = random.randint(10, 51)
    number2 = random.randint(10, 51)
    sum_of_num = number1 + number2

    def checkresult():
        global content
        i = int(content.get())
        if i == sum_of_num:
            label = tk.Label(window, text = "Correct Result", fg = "blue").pack()
        else:
            label = tk.Label(window, text = "Incorrect result!! Try again.", fg = "red").pack()


    window.title("Number Guessing Game")
    label = tk.Label(window, text = "Let's begin the Quiz", fg = "blue").pack()
    label = tk.Label(window, text = "---------------------", fg = "blue").pack()
    label = tk.Label(window, text = "Given two numbers", fg = "blue").pack()
    label = tk.Label(window, text = number1, fg = "blue").pack()
    label = tk.Label(window, text = number2, fg = "blue").pack()
    label = tk.Label(window, text = "Add these two numbers and enter the result", fg = "blue").pack()

    sum_of_numbers = tk.Entry(window, textvariable = content)
    sum_of_numbers.pack()
    sum_of_numbers.focus_set()

    button_to_check_result = tk.Button(window, text="Check whether answer is correct", fg = "red", command = checkresult).pack()


startgame()    
button_to_try_again = tk.Button(window, text="Try Again !!", fg = "red", command = startgame).pack()
window.mainloop()

Я ожидаю то же самое окно снова с очищенными входами.

0
Chitrank Bisht 25 Июн 2019 в 13:04

3 ответа

Лучший ответ

Чтобы очистить окно, вам нужно упаковать все метки в один кадр. Для этого вам нужно сначала импортировать ttk из tkinter:

from tkinter import ttk
fr = ttk.Frame()

Теперь все главное значение для переменных необходимо изменить с «окна» на «fr». Но для простоты я использовал переменную 'window' в качестве фрейма. Так,

root= tk.Tk()
window = ttk.Frame(root)

Теперь, чтобы очистить рамку, вы можете использовать любую из следующих команд:

window.pack_forget()
window.destroy()

Окончательный модифицированный код выглядит следующим образом:

import tkinter as tk
import random
from tkinter import ttk
root = tk.Tk()
content = tk.StringVar()
global window
window = ttk.Frame(root)

def startgame():
    global window
    window.pack_forget()
    window = ttk.Frame(root)
    number1 = random.randint(10, 51)
    number2 = random.randint(10, 51)
    sum_of_num = number1 + number2

    def checkresult():
        global content
        i = int(content.get())
        if i == sum_of_num:
            label = tk.Label(window, text = "Correct Result", fg = "blue").pack()
        else:
            label = tk.Label(window, text = "Incorrect result!! Try again.", fg = "red").pack()


    root.title("Number Guessing Game")
    label = tk.Label(window, text = "Let's begin the Quiz", fg = "blue").pack()
    label = tk.Label(window, text = "---------------------", fg = "blue").pack()
    label = tk.Label(window, text = "Given two numbers", fg = "blue").pack()
    label = tk.Label(window, text = number1, fg = "blue").pack()
    label = tk.Label(window, text = number2, fg = "blue").pack()
    label = tk.Label(window, text = "Add these two numbers and enter the result", fg = "blue").pack()

    sum_of_numbers = tk.Entry(window, textvariable = content)
    sum_of_numbers.pack()
    sum_of_numbers.focus_set()

    button_to_check_result = tk.Button(window, text="Check whether answer is correct", fg = "red", command = checkresult).pack()
    window.pack()

startgame()    
button_to_try_again = tk.Button(root, text="Try Again !!", fg = "red", command = startgame).pack()
window.mainloop()
0
jpt 27 Июн 2019 в 10:02

Во-первых, я бы определил

text_number1 = tk.StringVar()
text_number2 = tk.StringVar()
sum_of_num = 0

Тогда я бы изменил функцию startgame на

def startgame():
    global sum_of_num
    number1 = random.randint(10, 51)
    text_number1.set(str(number1))
    number2 = random.randint(10, 51)
    text_number2.set(str(number2))
    sum_of_num = number1 + number2

И ярлыки соответственно

label_num1 = tk.Label(window, textvar = text_number1, fg = "blue").pack() 
label_num2 = tk.Label(window, textvar = text_number2, fg = "blue").pack() 

Следующее, что вам нужно, это кнопка сброса

button_to_check_reset = tk.Button(window, text="Reset your question", fg = "red", command = new_question).pack()

И последняя, но не менее важная функция new_question

def new_question()
    startgame()
    sum_of_numbers.delete(0, 'end')

Это минимум.

Но если вы хотите иметь программу, которая не будет иметь появляющихся и устаревших меток, вам нужно добавить еще один stringvar, например, для инициализации.

answer_string = StringVar()
answer_string.set("Waiting for your answer")

Затем поставьте метку ответа сразу после других меток

answer_lable = tk.Label(window, textvar = answer_string, fg = "blue").pack() 

Затем вам нужно реформировать функцию проверки результата

def checkresult():
        i = int(content.get())
        if i == sum_of_num:
            answer_lable['fg'] ="green"
            answer_string.set("Correct, that was not hard right?")
        else:
            answer_lable['fg'] ="red"
            answer_string.set("Wrong, you moron")

И небольшая модификация функции newquestion:

def new_question()
    startgame()
    sum_of_numbers.delete(0, 'end')
    answer_lable['fg'] ="blue"
    answer_string.set("Waiting for your answer...")

Я надеюсь, что это поможет и удачи :)

0
Robot Mind 25 Июн 2019 в 22:45

Определите весь этот сегмент как функцию:

label = tk.Label(window, text = "Let's begin the Quiz", fg = "blue").pack()
label = tk.Label(window, text = "---------------------", fg = "blue").pack()
label = tk.Label(window, text = "Given two numbers", fg = "blue").pack()
label = tk.Label(window, text = number1, fg = "blue").pack()
label = tk.Label(window, text = number2, fg = "blue").pack()
label = tk.Label(window, text = "Add these two numbers and enter the result", fg = "blue").pack()

Затем привяжите эту функцию к кнопке «Сброс», которую вы планируете реализовать. Или, если вы хотите выполнять сброс каждый раз, когда пользователь нажимает кнопку «Проверить», вы можете вызвать функцию внутри checkresult ().

По сути, то, что вы будете делать, это отображать новые ярлыки поверх существующих ярлыков.

0
jpt 25 Июн 2019 в 10:19