Как изменить значение переменных в зависимости от функции в Kivy

Я кодирую программу викторины. Я хочу сделать так, чтобы каждый раз, когда пользователь нажимал на кнопку под названием "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')

Пожалуйста, сделайте свой код воспроизводимый, предоставив достаточно деталей, таких как подкласс app и т. д.

ApuCoder 22.03.2022 19:53

ты имеешь в виду self.button1.text = "new text ? Не создавайте новую кнопку, потому что она должна также add_widget() отображать ее в окне — и она не удаляет предыдущую кнопку — так что у вас будет две кнопки одновременно.

furas 22.03.2022 19:55

@furas да, я имею в виду, что текст должен быть новым, но кнопка останется. Нет необходимости создавать дополнительные кнопки. Как я могу предоставить новый текст, нажав кнопку GO

Jay 22.03.2022 20:00

как я уже сказал: self.button1.text = "new text" (в функции next_question) должен изменить текст на кнопке выхода.

furas 22.03.2022 20:00

Я пытался, но получил ошибку: TypeError: объект 'str' не может быть вызван. Я пытаюсь вызвать эту функцию, нажав кнопку GO, используя это: self.button_go.bind(on_press=self.next_question)

Jay 22.03.2022 20:04

вы должны показать ПОЛНУЮ ошибку, о которой идет речь, при запуске - так вы сможете быстрее получить помощь, и нам не придется тратить время на вопросы в комментариях.

furas 22.03.2022 20:08

показать ПОЛНУЮ ошибку в вопросе (не в комментариях) в виде текста (не изображения). Кажется, вы присваиваете какую-то строку self.next_question, и теперь это создает проблему — вы не можете использовать одно и то же next_question как имя функции и как переменную, чтобы сохранить какую-то строку.

furas 22.03.2022 20:09
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
7
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основываясь на частичном сообщении об ошибке, я предполагаю, что вы используете то же имя 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 за ваш ответ, но я подтвердил ответ. Его очень ценят. СПАСИБО!

Jay 22.03.2022 21:03

Другие вопросы по теме