Я кодирую программу викторины. Я хочу сделать так, чтобы каждый раз, когда пользователь нажимал на кнопку под названием "GO", картинка, о которой идет речь, менялась. При этом варианты ответов должны быть соответствующим образом изменены. Я имею в виду, что текст кнопок должен меняться каждый раз, когда пользователь нажимает кнопку «GO». В дальнейшем я планирую использовать случайный выбор из списка, но на данный момент мне просто нужно понять, как модифицировать текст кнопок и изображение на основе нажатия кнопки "GO". Я закодировал программу, но она не работает. Я использую Киви/Питон. Код приведен ниже. Я удалил все ненужные части кода, чтобы сделать его минимально воспроизводимым. Вы также можете посмотреть комментарии внутри кода, где я указывал на важные компоненты и ключевые проблемы. Скорее всего я что-то делаю не так, так как моя функция никаким образом не модифицирует данные, которые нужно изменить. Я подробно все описал в комментариях ниже. Пожалуйста, помогите мне решить эту проблему.
from kivy.uix.label import Label
from kivy.uix.image import Image
from kivy.uix.button import Button
from kivy.core.window import Window
from kivy.uix.screenmanager import Screen
from kivy.core.audio import SoundLoader
from kivy.config import Config
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')
class Quiz(Screen):
def __init__(self, **kwargs):
super(Quiz, self).__init__(**kwargs)
Window.size = (900, 600)
self.cols = 1
self.im = Image(source = "picture1.png") # Here I am adding the first picture only as an example, but after the clicking "GO" button the picture should changed depending on function which is described in the bottom of the code.
self.im.size_hint = (0.50, 0.50)
self.im.pos_hint = {"center_x": 0.5, "center_y": 0.80}
self.add_widget(self.im)
self.app_text = Label(font_size='16',
text = "Find correct answer!",
color='white',
halign='center')
self.app_text.pos_hint = {"center_x": 0.5, "center_y": 0.65}
self.add_widget(self.app_text)
# I have 4 buttons and as you can see these 4 buttons only have empty string value at the start, but after the clicking to button named "GO" (indicated below) the function (indicated at the bottom of code) should work and changed the string value of these buttons.
self.button1 = Button(text='', background_color='#F62C3F')
self.button2 = Button(text='', background_color='#F62C3F')
self.button3 = Button(text='', background_color='#F62C3F')
self.button4 = Button(text='', background_color='#F62C3F')
self.button_go = Button(text='GO', background_color='#04D0F9')
self.button1.size_hint = (0.15, 0.05)
self.button2.size_hint = (0.15, 0.05)
self.button3.size_hint = (0.15, 0.05)
self.button4.size_hint = (0.15, 0.05)
self.button_go.size_hint = (0.15, 0.05)
self.button1.pos_hint = {"center_x": 0.4, "center_y": 0.54}
self.button2.pos_hint = {"center_x": 0.4, "center_y": 0.48}
self.button3.pos_hint = {"center_x": 0.6, "center_y": 0.54}
self.button4.pos_hint = {"center_x": 0.6, "center_y": 0.48}
self.button_go.pos_hint = {"center_x": 0.5, "center_y": 0.36}
self.button_go.bind(on_press=self.next_question) # This button should call the function described below and then the buttons and picture should be changed based on function body.
self.add_widget(self.button1)
self.add_widget(self.button2)
self.add_widget(self.button3)
self.add_widget(self.button4)
self.add_widget(self.button_go)
# Actually this function is the main problem of mine. Function is not working and doesn't modify the text of buttons as I expected.
def next_question(self, instance):
self.im = Image(source = "picture_2.png")
self.button1 = Button(text='A', background_color='#F62C3F')
self.button2 = Button(text='B', background_color='#F62C3F')
self.button3 = Button(text='C', background_color='#F62C3F')
self.button4 = Button(text='D', background_color='#F62C3F')
ты имеешь в виду self.button1.text = "new text
? Не создавайте новую кнопку, потому что она должна также add_widget()
отображать ее в окне — и она не удаляет предыдущую кнопку — так что у вас будет две кнопки одновременно.
@furas да, я имею в виду, что текст должен быть новым, но кнопка останется. Нет необходимости создавать дополнительные кнопки. Как я могу предоставить новый текст, нажав кнопку GO
как я уже сказал: self.button1.text = "new text"
(в функции next_question
) должен изменить текст на кнопке выхода.
Я пытался, но получил ошибку: TypeError: объект 'str' не может быть вызван. Я пытаюсь вызвать эту функцию, нажав кнопку GO, используя это: self.button_go.bind(on_press=self.next_question)
вы должны показать ПОЛНУЮ ошибку, о которой идет речь, при запуске - так вы сможете быстрее получить помощь, и нам не придется тратить время на вопросы в комментариях.
показать ПОЛНУЮ ошибку в вопросе (не в комментариях) в виде текста (не изображения). Кажется, вы присваиваете какую-то строку self.next_question
, и теперь это создает проблему — вы не можете использовать одно и то же next_question
как имя функции и как переменную, чтобы сохранить какую-то строку.
Основываясь на частичном сообщении об ошибке, я предполагаю, что вы используете то же имя next_question
, что и имя функции, и сохраняете некоторую строку - и теперь это создает проблему.
Вы ожидаете, что self.next_question
дает функцию, но код видит строку, назначенную этой переменной.
Вы должны использовать разные имена.
Но без ПОЛНОГО сообщения об ошибке я не могу подтвердить, что проблема делает next_question
.
Может быть, проблема делает другую переменную.
Обновлено:
Тем временем я сделал минимальный рабочий код, который показывает, как изменить текст на кнопке - так я выразился - но ваша реальная проблема не нуждается в этом примере.
Но если раскомментировать self.change_text = "some text"
, то тоже должно получиться AssertionError: 'some text' is not callable
#import kivy
from kivy.app import App
from kivy.uix.button import Button
class MyApp(App):
def build(self):
self.button = Button(text='Hello World')
#self.change_text = "some text"
self.button.bind(on_press=self.change_text)
return self.button
def change_text(self, event):
self.button.text = 'Good Bye'
if __name__ == '__main__':
MyApp().run()
Большое спасибо за вас. Вы исправили мою проблему с вашим кодом. К сожалению, у меня меньше 15 баллов, поэтому я не могу +1 за ваш ответ, но я подтвердил ответ. Его очень ценят. СПАСИБО!
Пожалуйста, сделайте свой код воспроизводимый, предоставив достаточно деталей, таких как подкласс
app
и т. д.