#python-3.x #kivy
Вопрос:
Перейдя с Arduino на python, я привык ко всему, что более или менее работает в цикле.
Я пытаюсь понять, как python взаимодействует с kivy.
Я понимаю, что для того, чтобы сегмент кода выполнялся снова и снова, мне нужен, например, оператор while. Однако, если я использую код, который зацикливается до того, как он попадет в код kivy, он никогда не попадет в код kivy. Но если я сделаю цикл после кода kivy, он не запустится, пока я не закрою программу.
У меня есть google, и я вижу примеры простых проектов проектов python/kivy, в которых весь код относится к логике клея пользовательского интерфейса, чтобы он действительно что-то делал. Но я не видел ничего, что показывало бы код python, работающий независимо от проекта kivy.
Другими словами, если бы я сделал проект в Arduino, у меня был бы основной цикл, и я мог бы вызывать функции, а затем возвращаться из них. Однако я не понимаю, как лучше всего сделать это с помощью kivy/python.
Пример кода, который я опубликовал ниже, не является циклом, однако я ожидал бы, что он выполнит все за один раз. Но он запустит первые инструкции печати, а затем, когда я закрою приложение, будет запущена последняя инструкция печати.
Я понимаю, что циклы не рекомендуются при объектно-ориентированном программировании, это всего лишь простой пример в качестве ссылки на то, к чему я привык.
Для тех, кто скажет, что я не понимаю, о чем вы спрашиваете и что вы пытаетесь сделать или спросить?
Я пытаюсь спросить, куда мне поместить код python, который не относится непосредственно к коду киви, но должен выполняться циклами или чем-то еще, пока работает киви. Чтобы я мог сделать так, чтобы все происходило на стороне питона, не блокируя киви.
Для этого потребуется несколько программ на python? И оставьте программу kivy саму по себе, почти как файл .kv.
Или доза его требует, чтобы все было поставлено на занятия?
Спасибо за любые разъяснения, передовую практику или примеры.
from kivy.app import App
from kivy.uix.button import Button
print("test")
class FirstKivy(App):
def build(self):
return Button(text="Test text")
print("test2")
FirstKivy().run()
print("test3")
Комментарии:
1. Линия
FirstKivy().run()
проходит поApp
основной петле киви. и не возвращается до тех пор, пока этот циклApp
не завершится (выходы). Kivy основан на событиях, поэтому почти все в KivyApp
запускается в результате какого-либо события. Если вы пытаетесь запустить код, который выполняется долго (например, другой цикл), вам нужно использовать другойThread
или другойProcess
см. Параллелизм .
Ответ №1:
Вам нужно будет добавить многопоточность в свой код
from kivy.app import App
from kivy.uix.button import Button
import threading
print("test")
class FirstKivy(App):
def build(self):
return Button(text="Test text")
print("test2")
def run():
FirstKivy().run()
def print_stuff():
print("test3")
kivy_thread = threading.Thread(target=run)
print_thread = threading.Thread(target=print_stuff)
kivy_thread.start()
print_thread.start()