Запуск функции и класса одновременно python

Подскажите пожалуйста как запустить функцию и класс одновременно, пробовал вот так:

from kivy.app import App 
from kivy.uix.button import Button
from multiprocessing import Process


def test2():
    while 1:
        print('Hello world')



class Test1(App):
    def click(self, args):
        if self.button.text == "Вкл":
            self.button.background_color = [1,0,0,1]
            self.button.text = "Выкл"
        elif self.button.text == "Выкл":
            self.button.text = "Вкл"
            self.button.background_color = [.15, .70, .24, 1]


    def build(self):
        self.button = Button (
            text = "Вкл",
            font_size = 20, 
            background_color = [.15, .70, .24, 1],
            pos_hint= {'x': .65,'top': .15},        
            size_hint = (.21,.11), 
            background_normal = '',
            on_press = self.click
        )
        return self.button

if __name__ == "__main__":
    p1 = Process(target=Test1)
    p1.start()
    p2 = Process(target=Test2())
    p2.start()

Ответы (2 шт):

Автор решения: Victor VosMottor thanks Monica
from kivy.app import App
from kivy.uix.button import Button
from multiprocessing import Process


def test2():
    while 1:
        print('Hello world')


class Test1(App):
    def click(self, args):
        if self.button.text == "Вкл":
            self.button.background_color = [1, 0, 0, 1]
            self.button.text = "Выкл"
        elif self.button.text == "Выкл":
            self.button.text = "Вкл"
            self.button.background_color = [.15, .70, .24, 1]

    def build(self):
        self.button = Button(
            text="Вкл",
            font_size=20,
            background_color=[.15, .70, .24, 1],
            pos_hint={'x': .65, 'top': .15},
            size_hint=(.21, .11),
            background_normal='',
            on_press=self.click
        )
        return self.button


if __name__ == "__main__":
    p1 = Process(target=Test1().run)
    p1.start()
    p2 = Process(target=test2())
    p2.start()
→ Ссылка
Автор решения: Михаил Муругов

Что в Вашем варианте неправильно:

  • p1 = Process(target=Test1) - тут Вы в качестве target передаёте класс (даже не экземпляр!!). Т.е. предполагается, что в процессе будет запущено Test1() (или, то же самое, Test1.__call__()) - звучит странно, согласитесь.
  • p2 = Process(target=Test2()) - тут Вы в качестве target передаёте результат выполнения функции Test2. Но в функции Test2 бесконечный цикл, так что результат оттуда не вернётся. Но если даже функция что-то вернёт, это значение должно быть вызываемым (например, другая функция).

Как правильно:

  • p1 = Process(target=Test1().run) - создаётся экземпляр (()) класса Test1, затем в процессе будет вызван метод run экземпляра (ошибка self из Вашего комментария).
  • p2 = Process(target=Test2) - в отдельном процессе будет "крутиться" функция Test2 (а не результат из неё, как в Вашем варианте).
→ Ссылка