Как обновить элементы Kivy из потока?Python

Программы на Python
Ответить
Anonymous
 Как обновить элементы Kivy из потока?

Сообщение Anonymous »

У меня есть клиент сокетов, который вызывает класс View() каждый раз, когда получает сообщение. Я разделил свой код таким образом, чтобы этот класс мог просто использовать print() или любой другой метод отображения, как мне нравится. Однако, похоже, Киви этот метод не нравится. Я расширил класс Kivy BoxLayout для своего представления и могу вызывать функцию message(). Класс выглядит примерно так:

Код: Выделить всё

class View(BoxLayout):
def __init__(self, **kwargs):
super(View, self).__init__(**kwargs)
self.btn = Button(text='Default')
# Bind button press method
self.btn.bind(on_press=self.message)
self.add_widget(self.btn)
def message(self, message):
self.btn.text = 'Meow'
self.add_widget(Button(text='Meow'))
print(str(message))
Функция сообщения действительно вызывается и печатает, но интерфейс не обновляется. Однако когда я нажимаю кнопку, интерфейс обновляется, а также печатается.

Я рассматривал возможность использования StringProperty для изменения текста кнопки, но потерпели неудачу и в этом. В качестве примечания: на случай, если то, что я делаю, совершенно невозможно, я пытаюсь позже нарисовать весь интерфейс, состоящий из кнопок ширины * высоты, в виде доски.

Любой вклад очень ценен, он сводит меня с ума.

РЕДАКТИРОВАТЬ 1*
Я следил за несколькими комментариями и пробовал кое-что вне. Я добавил класс Clock и запланировал для него метод update() из View. Метод обновления просто меняет текст нескольких элементов. Я заметил, что это работает, когда я планирую это, как показано ниже:

Код: Выделить всё

def update(self, *args, **kwargs):
self.btn.text = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase) for i in range(32))
def message(self, message):
try:
print(message)
self.text = 'sending'
except Exception as e:
print(e)
Теперь поток просто присваивает свойство text, как показано в message(). Периодически вызываемые методы update() также работают, присваивая случайный текст. Однако теперь проблема в том, что он не может установить текст. Это не работает:

Код: Выделить всё

def update(self, *args, **kwargs):
self.btn.text = self.text
Должно быть, я где-то делаю неправильно, есть какие-нибудь предложения?

РЕДАКТИРОВАТЬ 2* [/b]
Ошибка, которую я пытаюсь устранить, находится здесь.

Подробнее здесь: https://stackoverflow.com/questions/338 ... m-a-thread
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»