Как добавить функциональность к моей кнопке «Попробуй еще раз» в tkinter? - PullRequest
0 голосов
/ 25 июня 2019

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

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()

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

Ответы [ 3 ]

0 голосов
/ 26 июня 2019

Сначала я бы определил

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 голосов
/ 27 июня 2019

Чтобы очистить окно, вам нужно упаковать все метки в один кадр.Для этого вам необходимо сначала импортировать 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 голосов
/ 25 июня 2019

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

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 ().

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

...