Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+2

Помогите tkinter, python

Есть допустим 3 вопроса (1-Что пьет корова?; 2-Какого цвета трава; 3-Какое время года самое холодное?), нужно сделать так, чтобы при запуске кода, слева было 2 кнопки (1-"Вопрос"; 2-"Ответ"), а справа было пустое поле, при нажатии кнопки 1,на пустое поле выводился рандомно 1 из 3 существующих вопросов (допустим Что пьет корова?) и также под ним было поле ввода ответа (надо чтобы оно было крупное) и пользователь мог ввести туда ответ, после нажать кнопку 2 и под полем ввода показывался правильный ответ (вода), а если пользователь не знает ответа, то он может нажать на кнопку 2 и также ответ бы показался снизу под полем ввода, и после повторного нажатия на кнопку ВОПРОС из существующего списка снова выводился рандомно вопрос, но чтобы не повторялся с предыдущим и так до бесконечности пока вопросы не закончатся

По дате
По рейтингу
Аватар пользователя
Просветленный
1мес
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
import tkinter as tk
import random

# List of questions and answers
data = [
    ("Что пьет корова?", "Вода"),
    ("Какого цвета трава?", "Зеленая"),
    ("Какое время года самое холодное?", "Зима")
]

class QAApp(tk.Tk):
    def __init__(self, qa_data):
        super().__init__()
        self.title("Викторина")
        self.geometry("600x300")

        self.qa_data = qa_data.copy()
        self.used = []
        self.current = None

        # Left frame for buttons
        left_frame = tk.Frame(self)
        left_frame.pack(side=tk.LEFT, padx=10, pady=10)

        self.btn_question = tk.Button(left_frame, text="Вопрос", width=15, command=self.show_question)
        self.btn_question.pack(pady=5)

        self.btn_answer = tk.Button(left_frame, text="Ответ", width=15, command=self.show_answer)
        self.btn_answer.pack(pady=5)

        # Right frame for question, input, and answer
        right_frame = tk.Frame(self)
        right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=10, pady=10)

        self.lbl_question = tk.Label(right_frame, text="", wraplength=350, font=(None, 14))
        self.lbl_question.pack(pady=5)

        self.txt_answer = tk.Text(right_frame, height=3, font=(None, 12))
        self.txt_answer.pack(fill=tk.X, pady=5)

        self.lbl_correct = tk.Label(right_frame, text="", fg="blue", font=(None, 12))
        self.lbl_correct.pack(pady=5)

    def show_question(self):
        if not self.qa_data:
            # Reset when all questions used
            self.qa_data = self.used.copy()
            self.used.clear()

        qa = random.choice(self.qa_data)
        self.qa_data.remove(qa)
        self.used.append(qa)
        
        self.current = qa
        question, _ = qa

        # Update UI
        self.lbl_question.config(text=question)
        self.txt_answer.delete("1.0", tk.END)
        self.lbl_correct.config(text="")

    def show_answer(self):
        if self.current:
            _, answer = self.current
            self.lbl_correct.config(text=f"Правильный ответ: {answer}")

if __name__ == "__main__":
    app = QAApp(data)
    app.mainloop()

Я добавила готовое приложение на Tkinter:

  • Две кнопки слева: «Вопрос» и «Ответ».

  • При нажатии «Вопрос» справа появится случайный вопрос из списка, поле ввода (Text) очищается, а предыдущий правильный ответ скрывается.

  • Поле ввода большого размера (несколько строк) чтобы удобно вводить развернутый ответ.

  • При нажатии «Ответ» под полем ввода отобразится правильный ответ.

  • Вопросы циклично берутся без повторений, и после исчерпания списка — список сбрасывается и можно начинать заново.