Есть ли способ определить команду для переключателей, чтобы показать правильный или ложный ответ в тесте с несколькими вариантами ответов? - PullRequest
0 голосов
/ 10 февраля 2019

Я новичок, пытающийся создать тест с несколькими вариантами ответов на python с Tkinter.Извините, если я создал грязный код.Я использую переключатели для разных ответов.Я хотел бы показать сообщение «Это правильный ответ» при выборе варианта 1 и «Это неправильный ответ» при выборе любого другого параметра.В настоящее время сообщение всегда «Это неправильный ответ», независимо от выбранной опции.Я понял, что ценность не имеет к этому никакого отношения, но я не нашел правильный способ сделать это.Есть ли способ определить этот вид команды?Большое спасибо за любую помощь, рекомендации и ответы.

from tkinter import *
from tkinter import ttk
from tkinter import messagebox

window = Tk()
window.title("Quiz")
window.geometry("500x150")
score = 0
def inst():
    t = Label(window, text="Choose the correct statement to answer the 
question")
    t.pack()

def start():
    start_game()

greet = Label(window, text="Welcome to the Quiz")
greet.pack()
startButton = Button(window, command=start, text="Start")
startButton.pack()
instr = Button(window, text="Instructions", command=inst)
instr.pack()
end = Button(window, text="Exit", command=window.destroy)
end.pack()

def start_game():
    top = Toplevel()
    top.title("Question 1")
    var = StringVar()
    def check():
        if var.get() is True:
            messagebox.showinfo('Congrats', message='This is the correct 
answer.Score is {}'.format(score))
        else:
            messagebox.showinfo('Lose', message='This answer is wrong.')
    R1 = Radiobutton(top,
    text="Option 1",
    indicatoron=0,
    width=20,
    padx=20,
    pady=10,
    variable=var,
    value=True,
    command=check)
    R1.pack( anchor = W )
    R2 = Radiobutton(top,
    text="Option 2",
    indicatoron=0,
    width=20,
    padx=20,
    pady=10,
    variable=var,
    value=False,
    command=check)
    R2.pack( anchor = W )
    R3 = Radiobutton(top,
    text="Option 3",
    indicatoron=0,
    width=20,
    padx=20,
    pady=10,
    variable=var,
    value=False,
    command=check)
    R3.pack( anchor = W)
    label = Label(top)
    label.pack()

window.mainloop()

1 Ответ

0 голосов
/ 10 февраля 2019

Так как вы работаете с булевыми значениями, я подумал, что имеет смысл использовать вместо BooleanVar.

Вы можете просто передать кнопки функции check и изменить их цвета, если вызнать, какая из них правильная:

def check(btn1, btn2):
    btn1.config(bg='green')
    btn2.config(bg='red')

Затем измените радиокнопки как таковые (чуть ниже того места, где вы их определили):

for btn in (R1, R2):
    btn.config(command=lambda btn1=R1,btn2=R2:check(btn1,btn2))

Обратите внимание, я использовал две кнопки как R2 и R3 имели одинаковые значения, поэтому они будут эффективно объединены в единое целое.

Вот пример;он использует список кнопок для хранения всех созданных радиокнопок и меняет цвет каждой из них в зависимости от их текста, а также проверяет, получил ли игрок правильный ответ.

import tkinter as tk

def check_answer():
    if question_answer.get() == 2: #get the value of the integer variable
        print('you got it right')  #if it has been set to 2 by the player, they got it right
    for btn in btnlist: #check each of our radiobuttons
        if int(btn['text']) == 2: #if the text of that button is equal to the correct answer
            btn.config(bg='green') #make it green
        else:
            btn.config(bg='red') #otherwise make it red

win = tk.Tk()
question = 'What is 1+1?' #put your question here

question_answer = tk.IntVar() #we use an Integer Variable to store the value of the answer
question_answer.set(0) #we set the value of the correct answer to 0

lbl = tk.Label(win, text=question)
lbl.grid(columnspan=4)

column = 0
btnlist = []
for answer in range(4): #create radiobuttons in a for loop
    btn = tk.Radiobutton(win, text=str(answer), variable=question_answer,
                         value=answer) #associate each button with the answer variable
    #but give each button its own unique value
    btnlist.append(btn)
    btn.grid(row=1, column=column)
    column += 1

confirm_btn = tk.Button(win, text='Confirm', command=check_answer)
confirm_btn.grid(columnspan=4)
win.mainloop()

В этом примере я использовалIntVar поскольку ответом является целое число, вы также можете использовать BooleanVar или StringVar таким же образом, как это необходимо.

РЕДАКТИРОВАТЬ: Согласно вашему запросу в комментариях:

import tkinter as tk

win = tk.Tk()
text_to_add_to_btns = ['A', 'B', 'C', 'D', 'E'] #change to whatever text you like
#with however many elements which represent each individual button
btn_list = []
Column = 0
for txt in text_to_add_to_btns:
    btn = tk.Button(win, text=txt)
    btn.grid(row=0, column=Column, sticky='nesw')
    btn_list.append(btn)
    Column += 1
win.mainloop()

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

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