我想使用包括多处理程序在内的Kivy程序。 示例代码按我的想法工作;但是,出现了空白的空白屏幕,该屏幕不接受该操作。它是在我开始多处理过程时出现的。
我已经知道使用threading.Thread不会出现空白屏幕;但是,我要实现的实际程序需要多处理过程。 如何删除该空白屏幕? 这就是我所看到的。
P.S。
考虑到评论,也许这是Windows上的一个特殊问题。 我正在使用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()
答案 0 :(得分:0)
事实证明,问题是在文件开头创建的ScreenManager
。将sm = ScreenManager(transition=NoTransition())
移至应用程序的build
方法中,它应该可以正常工作,而无需创建第二个屏幕。
经过一些研究,看来问题出在新的Process
导入原始python脚本之后。由于sm = ScreenManager(transition=NoTransition())
在原始文件中不受保护,因此在导入时将执行它。因此,解决方案就是将命令放置在受保护的任何位置。因此,另一个可行的方法是将命令移到if __name__ == '__main__':
命令之前的Test().run()
块中。