Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 8, 2020 20:19:54

AD0DE412
Зарегистрирован: 2019-05-12
Сообщения: 1130
Репутация: +  44  -
Профиль   Отправить e-mail  

Создание теста с выбором ответов

https://sourceforge.net/projects/wxformbuilder/files/wxformbuilder-nightly/3.5.1-rc1/
https://github.com/wxFormBuilder/wxFormBuilder
https://github.com/wxFormBuilder/wxFormBuilder/releases/download/v3.9.0/wxFormBuilder_v3.9.0.exe



1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например), нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Июнь 8, 2020 20:22:13)

Офлайн

#2 Июнь 9, 2020 13:27:33

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1353
Репутация: +  118  -
Профиль   Отправить e-mail  

Создание теста с выбором ответов

oDoDo
Осталось понять как этот код привязать к оболочке (Tkinter или любой другой)

переделал свой код под интерфейс

 from tkinter import *
class TestQuestion: # класс Тестовый вопрос
	def __init__(self,text,correct_variant,variant_of_ansver):
		self.text = text # текст вопроса
		self.correct_variant = correct_variant # правильный вариант
		self.variant_of_answer= variant_of_ansver # варианты ответа
class Test: # класс Тест
	def __init__(self,title='test',test_question_list = []):
		self.title = title # название теста
		self.test_question_list = test_question_list # список тестовых вопросов
		self.total_questions = len(test_question_list) # количество вопросов в тесте
	def add_test_question(self): # добавить тестовый вопрос в тест
		# чтобы увидеть код,перечислите 1$
		pass
	def remove_test_question(self): # удалить тестовый вопрос в тест
		# чтобы увидеть код,перечислите 1$
		pass
	def show_test_question_list(self): # просмотреть список тестовых вопросов
		# чтобы увидеть код,перечислите 1$
		pass
class TestInterface: # интерфейс для теста
	def __init__(self,test):
		self.root = Tk() # основное окно
		self.root.title(test.title) # надпись вверху окна
		self.root.geometry("300x300")# геометрия окна
		self.font = "Arial 12 bold"# шрифт виджетов
		self.lbl_text = StringVar()# переменная lbl
		self.lbl_text.set("для начала теста нажмите 'начать'")
		self.lbl = Label(textvariable=self.lbl_text,font = self.font,wraplength =300)
		self.lbl.pack(side=TOP)#расположение вверху окна
		self.checkbtn_list =[] #список галочек
		self.score = 0 #счет
		self.variant = StringVar() # вариант ответа выбранный пользователем
		self.variant.set(0) # вариант не выбран
		self.n = 0 # счетчик шагов
		self.lbl_checked = Label(font = "Arial 12 bold") # lbl который пишет Правильно\ неправильно
		self.lbl_checked.pack(side=BOTTOM) # внизу окна
		self.btn = Button(text="начать",font = "Arial 12 bold", command=self.change_lbl_text) # кнопка
		self.btn.pack(side=BOTTOM) #
		self.root.mainloop() #обновление окна
	def change_lbl_text(self): #изменение текста верхнего lbl
		if self.n< test.total_questions:# если число шагов меньше количества вопросов в тесте:
			self.btn.config(text="следующий>>", state=DISABLED,command = self.next_quest) #кнопка меняет текст и тд...
			self.lbl_text.set("Задача № {}\n{}".format(self.n+1,test.test_question_list[self.n].text)) # меняется текст лейбла
			self.set_check_btn()# метод установки галочек
			self.lbl_checked.config(text="\nНабрано баллов: {}".format(self.score)) # изменяется текст другог лейбла
		else:
			print("usyo pizdec") # чтобы понять что вопросы кончились
			self.end() # метод конец
	def set_check_btn(self): #метод установки галочек
		for key,value in test.test_question_list[self.n].variant_of_answer.items(): # для ключ,значение присвоить ключ,значение из каждого варианта ответа тестового вопроса
			ch =Checkbutton(text ="{}) {}".format(key,value),font = "Arial 12 bold",onvalue =key,variable =self.variant,command = self.checked)# создает галочку
			ch.pack() # прикручивает к окну
			self.checkbtn_list.append(ch) # добавляет в список галочек
	def remove_check_btn(self): # метод удаляет галочки с окна
		if self.checkbtn_list: # если список не пустой
			for ch in self.checkbtn_list: # каждую галочку
				ch.destroy() # убирает с окна
			self.checkbtn_list.clear() # очищает список
	def change_check_btn(self):# метод изменяет свойства галочек
		for ch in self.checkbtn_list:
			ch.config(state=DISABLED)#отключает
			if ch["onvalue"] == test.test_question_list[self.n].correct_variant: # если правильный вариант
				ch.config( disabledforeground="#000", bg="#0f0") # зеленый
			elif ch["onvalue"]== self.variant.get():# иначе
				ch.config(disabledforeground="#000", bg="#f00") # красный
	def checked(self): # проверка варианта с вариантом ответа
		if self.variant.get() == test.test_question_list[self.n].correct_variant: # если сходится
			self.score+=1 # прибавлет балл
			self.btn.config(state = NORMAL)#делает кнопку активной
			self.lbl_checked.config(text="Правильно\nНабрано баллов: {}".format(self.score))#изменяет лейбл
		else:
			self.lbl_checked.config(text="Вы ошиблись\nНабрано баллов: {}".format(self.score))#изменяет лейбл
			self.btn.config(text ="Попробовать снова",command = self.reset,state = NORMAL)# изменяет свойства кнопки
		self.change_check_btn() # изменяет цвет галочки
	def reset(self): # обнуляет переменные в начальное положение
		self.n = 0
		self.score = 0
		self.variant.set(0)
		self.remove_check_btn()
		self.lbl_text.set("для начала теста нажмите 'начать'")
		self.lbl_checked.config(text='')
		self.btn.config(text="начать", command=self.change_lbl_text)
	def next_quest(self): # следующий шаг
		self.n+=1
		self.variant.set(0)# обнуляет вариант ответа
		self.remove_check_btn()# удаляет старые галки
		self.change_lbl_text() # изменяет лейбл на следующий вопрос
	def end(self): # титры в конце
		self.remove_check_btn()
		self.lbl_checked.config(text="Тест пройден.Вы свободны\nНабрано баллов: {}".format(self.score))
		self.lbl_text.set("Вопросы закончились")
		self.btn.config(text="Пройти тест снова", command=self.reset)
test_question_list=[]
test_question_list.append(TestQuestion("x+2=4", 'a', {'a': 'x=2', 'b': 'x=4', 'c': 'x=3', 'd': 'x=9'}))
test_question_list.append(TestQuestion("2+2*2", 'b', {'a': '8', 'b': '6'}))
test = Test("тест по высшей математике",test_question_list) #  класс тест принимает на вход список из тестовыйх вопросов
TestInterface(test) # интерфейс принимает тест

Отредактировано xam1816 (Июнь 9, 2020 21:22:40)

Офлайн

#3 Июнь 9, 2020 17:56:19

oDoDo
Зарегистрирован: 2020-05-05
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание теста с выбором ответов

xam1816
usyo spasibo

Офлайн

#4 Июнь 9, 2020 18:16:46

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1353
Репутация: +  118  -
Профиль   Отправить e-mail  

Создание теста с выбором ответов

oDoDo
xam1816usyo spasibo

Офлайн

#5 Июнь 9, 2020 20:33:08

oDoDo
Зарегистрирован: 2020-05-05
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание теста с выбором ответов

xam1816
Не могу понять как перенос текста делать?

Офлайн

#6 Июнь 9, 2020 20:36:15

oDoDo
Зарегистрирован: 2020-05-05
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание теста с выбором ответов

Тут

 test_question_list.append(TestQuestion("Очень много текста который не влезет в окно интерфейса, что с этим делать не понятно. Очень много текста который не влезет в окно интерфейса, что с этим делать не понятно", 'b', {'a': '8', 'b': '6'}))

Офлайн

#7 Июнь 9, 2020 21:20:50

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1353
Репутация: +  118  -
Профиль   Отправить e-mail  

Создание теста с выбором ответов

oDoDo
Очень много текста который не влезет в окно интерфейса, что с этим делать не понятно

в опции lbl добавить
 wraplength =300

Офлайн

#8 Июнь 9, 2020 21:23:32

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1353
Репутация: +  118  -
Профиль   Отправить e-mail  

Создание теста с выбором ответов

отредактировал уже в сообщении

Офлайн

#9 Июнь 9, 2020 21:39:48

oDoDo
Зарегистрирован: 2020-05-05
Сообщения: 70
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание теста с выбором ответов

xam1816
Спасибо, а для чего вы self везде в коде добавляете какие это дает преимущества?

def __init__(self,test):
self.root = Tk() # основное окно
self.root.title(test.title) # надпись вверху окна
self.root.geometry("300x300")# геометрия окна

Можно же сделать и так?
def __init__(test):
root = Tk() # основное окно
root.title(test.title) # надпись вверху окна
root.geometry("300x300")# геометрия окна

Офлайн

#10 Июнь 9, 2020 22:11:29

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1353
Репутация: +  118  -
Профиль   Отправить e-mail  

Создание теста с выбором ответов

код можно написать сплошным текстом, и он тоже будет работать,
self. это из ООП(объектно ориентированное программирование),пока не заморачивайтесь,уделите внимание основам программирования,решайте простые задачи

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version