Как запустить два процесса одновременно с помощью KIVY - PullRequest
0 голосов
/ 03 апреля 2020

Я изо всех сил пытаюсь одновременно запустить мое приложение Kivy вместе с python скриптом, который импортируется локально.

Полный python код

import Client # Locall import
import time
from threading import Thread
from kivy.app import App
from kivy.uix.button import Button
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen

class MainWindow(Screen):
    pass

class SecondWindow(Screen):
    pass

class WindowManager(ScreenManager):#will manage navigation of windows       
    pass

kv = Builder.load_file("my.kv")

class Sound(App):
    def build(self):
        return kv
    def ipconfig(self,input_ip):
        if len(input_ip) == 13:
            print('Address binded!!')
            Client.host = input_ip #Modify ip adress
        else:
            print('Invalid input_ip')```

if __name__ == '__main__':
    #Sound().run()#Kivy run method
    Thread(target = Sound().run()).start()
    time.sleep(10)
    Thread(target = Client.father_main).start()

Где происходит многопоточность

if __name__ == '__main__':
    #Sound().run()#Kivy run method
    Thread(target = Sound().run()).start()
    time.sleep(10)
    Thread(target = Client.father_main).start() #Client is locally imported

ПРОБЛЕМЫ

1.Только запускается приложение kivy, но функция Father_main не удается.

2. Единственный раз, когда выполняется Father_main, - это когда я закрываю приложение kivy.

3.Если я пытаюсь удалить run () из Sound (). Я получаю TypeError: 'Sound' object is not callable, и Father_main немедленно запускает

4.Если я только уберу скобку из «run ()», то она превратится в «run». Я получаю Segmentation fault (core dumped)

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

kivy не поощряет использование time.sleep () , и я до сих пор не знаю, что именно представляет из себя ваша программа, но здесь есть решение.

создайте метод on_start (Метод, который запускается при запуске приложения kivy), и добавьте, запустите метод ipconfig оттуда, но вы собираетесь запустить его асинхронно.

from multiprocessing.pool import ThreadPool


class Sound(App):
    def on_start(self):
        pool = ThreadPool(processes=1)
        async_start = pool.apply_async(self.ip_config, ("value for ip_input here"))
        # do some other things inside the main thread here

if __name__ == "__main__":
    Sound().run()

1 голос
/ 04 апреля 2020

Вам нужно запустить App в главном потоке. Я бы предложил что-то вроде:

def start_father_main(dt):
    Thread(target = Client.father_main).start() #Client is locally imported

if __name__ == '__main__':
    Clock.schedule_once(start_father_main, 10)
    Sound().run()

Я не тестировал этот код, но он должен дать вам идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...