При запуске программы Python + Kivy, включая многопроцессорную, появляется белый пустой экран - PullRequest
0 голосов
/ 28 декабря 2018

Я хочу использовать программу Kivy, включая многопроцессорный процесс.Пример кода работал, как я думал, однако появился пустой белый экран, который не принимает операцию.Он появился как раз тогда, когда я запустил многопроцессорный процесс.

Я уже знаю, что при использовании многопоточности. Пустой экран не появится, однако для реальной программы, которую я хочу реализовать, требуется многопроцессорный процесс.Как я могу удалить этот пустой экран?Это то, что я видел.

enter image description here

PS

Учитывая комментарии, возможно, это особая проблема для окон.Я использую Windows 10, Python 3.6.4.

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition
import time
from datetime import datetime
import multiprocessing as mp
from multiprocessing import Process, Queue, freeze_support

sm = ScreenManager(transition=NoTransition())

Builder.load_string('''
<TestScreen>:
    BoxLayout:
        orientation: "vertical" # place object vertically
        Label:
            size_hint: 1, 1
            text: 'TITLE'
            font_size: 150
            color: 1, 1, 1, 1
        Button:
            text: 'start'
            on_press: root.start_mp()
        Button:
            text: 'stop'
            on_press: root.stop_time()
''')


def count_time(x):
    for i in range(x):
        print('count={}'.format(i))
        time.sleep(1)

class Test(App):

    def build(self):
        sm.add_widget(TestScreen(name='test'))
        return sm

class TestScreen(Screen):

    p1 = mp.Process(target=count_time, args=(10, ))
    def start_mp(self):
        self.p1 = mp.Process(target=count_time, args=(10, ))
        self.p1.start()

    def stop_time(self):
        self.p1.terminate()
        print(datetime.now())

if __name__ == '__main__':
    Test().run()

1 Ответ

0 голосов
/ 30 декабря 2018

Оказывается, проблема в ScreenManager, который вы создаете в начале вашего файла.Переместите sm = ScreenManager(transition=NoTransition()) в метод build вашего приложения, и оно должно работать без создания второго экрана.

После некоторых исследований выясняется, что проблема связана с новым Process импортом исходного Pythonскрипт.Поскольку sm = ScreenManager(transition=NoTransition()) не защищен в исходном файле, он выполняется при этом импорте.Таким образом, решение состоит в том, чтобы просто поместить эту команду в любое место, которое защищено.Таким образом, другая возможность, которая будет работать, - переместить эту команду в блок if __name__ == '__main__': непосредственно перед командой Test().run().

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