Я делаю проект для моей школы. Мне нужно принимать вызовы, если вы нажмете кнопку, вы получите случайный вызов, но вы также получите случайный ответ. Я хочу связать вызов с правильным ответом. Я не знаю, как это сделать с помощью индекса, поэтому, если кто-нибудь покажет мне пример того, как это сделать, я буду признателен за это.
Я спросил своих учителей и искал, но ничего не смог найти.
from tkinter import *
import random
theWindow = Tk()
theWindow.geometry('500x500')
theWindow.title('Challenges')
Label(theWindow, text='Press the button below to generate random challenges', bg= 'grey', fg='white').pack()
challenges = ['You are going through Russia. Do you have the item winterjacket?\n \n Option 1: Yes \n Option 2: No',
'A thief grabs your bag with items: What are you going to do?\n\n
Option 1: Not chasing the thief \n Option 2: Chasing the thief',
'You dont have money for food anymore:\n You found a job for a week. \n Are you going to take the job?:\n\n Option 1: Yes, take the job \n
Option 2: No, you don"t take the job',
'You walk along a grave and hear a sound: \n What are you going to do?: \n \n Option 1: You run away \n Option 2: You take a look',
'You won an helicopter flight and youre in an helicopter right now. \n The helicopter starts to fall down. \n What are you going to do?: \n \n Option 1: Grab a parachute and jump out of the helicopter \n Option 2: Stay in the helicopter',
'You see an old lady carrying an heavy bag. \n What are you going to do?: \n \n Option 1: Walk away \n Option 2: Help the old lady']
Outcome = ['+10 HP','+10 HP','+10 HP','+10 HP','+10 HP','+10 HP','+10 HP','+10 HP and skip 1 turn', '+20 HP','+20 HP',
'+20 HP','+20 HP', '+30 HP','+30 HP','+30 HP', '+40 HP', '+10 HP + 1 item','+10 HP + 1 item','+10 HP + 1 item',
'+20 HP + 1 item','+20 HP + 1 item', '+20 HP + 2 item', 'Back to 100 HP', 'Nothing happens',
'-10 HP','-10 HP','-10 HP','-10 HP', '-20 HP','-20 HP','-20 HP','-20 HP','-20 HP',
'-20 HP', '-30 HP', 'Lose all HP', '-40 HP', '-50 HP', 'Lose all items', 'Lose all items', 'Skip 1 turn', '-20 HP and skip 1 turn',
'You have to throw the dice: if you get 1, 3 or 5 you can get an item. If you throw 2, 4 or 6 you will get -10 HP damage.',
'Nothing happens']
def challenges_button():
challenge = Label(theWindow, text=random.choice(challenges))
challenge.place(relx=0.5, rely=0.3, anchor=CENTER)
def answers():
answer = Label(theWindow, text= random.choice(Outcome))
answer.place(relx=0.5, rely=0.7, anchor=CENTER)
def answers1():
answer1 = Label(theWindow, text= random.choice(Outcome))
answer1.place(relx=0.5, rely=0.7, anchor=CENTER)
#The buttons
generate_button = Button(theWindow, text='Generate Challenge', height=3,
width=20, command=challenges_button, bg='black', fg='white')
generate_button.place(relx=0.5, rely=0.1, anchor=CENTER)
button_1_Button = Button(theWindow, text='Option 1', height=1, width=20,
command=answers, bg='black', fg='white')
button_1_Button.place(relx=0.5, rely=0.55, anchor=CENTER)
button_2_Button = Button(theWindow, text='Option 2', height=1, width=20,
command=answers1, bg='black', fg='white')
button_2_Button.place(relx=0.5, rely=0.6, anchor=CENTER)
Ожидаемое: вы нажимаете кнопку "Создать вызов" и получаете правильный ответ. Фактический результат теперь таков, что вы получаете вызов, но случайный ответ, поэтому ответ не верен.
Это небольшой обходной путь, начиная с той точки, где вы сейчас находитесь. Поскольку для каждого вопроса есть ровно 2 результата, я хотел бы прежде всего сгруппировать все "правильные ответы" для каждого вызова в подсписки, как показано ниже (составьте эти ответы, но вы получите точку):
new_outcome = [['+10 HP', '-10 HP'], ['+20 HP', '+10 HP'], ...]
Кроме того, убедитесь, что вы расположили их в правильном порядке, чтобы первая пара ответов в списке new_outcome
принадлежала первой задаче в списке challenges
, а также ответом для варианта 1 был первый из двух элементов.
Быстрое редактирование: если я правильно понял ваш комментарий к исходному вопросу, ваши ответы уже в правильном порядке. Так что просто создайте понимание списка следующим образом:
new_outcome = [[Outcome[2*i], Outcome[2*i + 1]] for i in range(int(len(Outcome) / 2))]
создать желаемый список пар ответов.
Теперь вы можете создать словарь (более подробную информацию о словарях смотрите здесь), использовать задачи в качестве ключей и группировать каждую задачу с соответствующими ответами (упакованными в список):
c_and_a = dict()
for item in challenges:
c_and_a[item] = new_outcome[challenges.index(item)]
>> c_and_a = {'challenge_1':['+10 HP', '-10 HP'], 'challenge_2':['+20 HP', '+10 HP'], ...}
Теперь определите команды кнопки следующим образом. Обратите внимание, что метод, который я предлагаю здесь, требует от вас определения метки challenge
вне функции, потому что все функции должны иметь к ней доступ. Вы можете сделать это внизу вместе со всеми вашими другими виджетами, ваши функции по-прежнему имеют к нему доступ, даже если они определены над ним.
def challenges_button():
challenge.config(text=random.choice(list(c_and_a.keys())))
c_and_a
это словарь. В python 3.x, который, как я полагаю, вы используете на tkinter
импорта из d.keys()
, d.keys()
возвращает итератор по всем ключам словаря d
. Так как random.choice
работает только со списками, мы должны сначала преобразовать этот итератор в список с помощью команды list()
.
Теперь вы выбрали задачу, но пользователь все еще должен выбрать ответ. Вы можете хранить случайно выбранный ключ в переменном, чтобы использовать его в дальнейшем для определения правильной пары ответов, но я хотел бы предложить только чтение challenge
ярлыка снова. И, наконец, определите одну метку ответа вне ваших функций, чтобы избежать дублирования:
def answers():
chall = challenge.cget('text') # this will read the challenge label
answer.config(text=c_and_a[chall][0]) # for option 1
def answers1():
chall = challenge.cget('text')
answer.config(text=c_and_a[chall][1]) # for option 2
answer = Label(theWindow)
answer.place(relx=0.5, rely=0.7, anchor=CENTER)
Теперь тебе должно быть хорошо идти!
Что вы можете сделать, это создать случайный индекс в списке challenges
. И используя этот индекс, вы можете настроить text
метки, используя вызов, представленный для этого индекса в списке challenges
. В соответствии с этим вы также знаете, что два ответа на него - это 2i
-й и 2i+1
-й элементы в списке Outcome
.
Есть также несколько проблем с вашим кодом. Если вы нажмете кнопку " Generate
несколько раз, они начнут перекрываться. Так что я удалил это из функции.
import tkinter as tk
import random
theWindow = tk.Tk()
theWindow.title('Challenges')
tk.Label(theWindow, text='Press the button below to generate random challenges', bg= 'grey', fg='white').grid(row=0)
index = None
challenges = ['Q1) You are going through Russia. Do you have the item winterjacket?\n \n Option 1: Yes \n Option 2: No',
'Q2) A thief grabs your bag with items: What are you going to do?\n\n Option 1: Not chasing the thief \n Option 2: Chasing the thief',
'Q3) You dont have money for food anymore:\n You found a job for a week. \n Are you going to take the job?:\n\n Option 1: Yes, take the job \n Option 2: No, you don"t take the job',
'Q4) You walk along a grave and hear a sound: \n What are you going to do?: \n \n Option 1: You run away \n Option 2: You take a look',
'Q5) You won an helicopter flight and youre in an helicopter right now. \n The helicopter starts to fall down. \n What are you going to do?: \n \n Option 1: Grab a parachute and jump out of the helicopter \n Option 2: Stay in the helicopter',
'Q6) You see an old lady carrying an heavy bag. \n What are you going to do?: \n \n Option 1: Walk away \n Option 2: Help the old lady']
Outcome = ['q1 a1', 'q1 a2', 'q2 a1', 'q2 a2', 'q3 a1', 'q3 a2', 'q4 a1', 'q4 a2', 'q5 a1', 'q5 a2', 'q6 a1', 'q6 a2']
challenge = tk.Label(theWindow)
challenge.grid(row=2)
answer = tk.Label(theWindow)
answer.grid(row=5)
def challenges_button():
global index
index = random.choice(range(len(challenges)))
answer.configure(text="")
challenge.configure(text=challenges[index])
def answers():
global index
answer.configure(text=Outcome[2*index])
def answers1():
global index
answer.configure(text=Outcome[2*index+1])
#The buttons
generate_button = tk.Button(theWindow, text='Generate Challenge', height=3, width=20, command=challenges_button, bg='black', fg='white')
generate_button.grid(row=1)
button_1_Button = tk.Button(theWindow, text='Option 1', height=1, width=20, command=answers, bg='black', fg='white')
button_1_Button.grid(row=3)
button_2_Button = tk.Button(theWindow, text='Option 2', height=1, width=20, command=answers1, bg='black', fg='white')
button_2_Button.grid(row=4)
theWindow.mainloop()
Результат: