Kivy-Python 在多处理中工作,再打开一个白屏

Posted

技术标签:

【中文标题】Kivy-Python 在多处理中工作,再打开一个白屏【英文标题】:Kivy-Python working in multi processing opening one more white screen 【发布时间】:2020-09-03 03:35:41 【问题描述】:
    import file...
    from mobus import modbus
    .....

class MainWindow(Screen):
    def __init__(self, **kwargs):
        super(MainWindow, self).__init__(**kwargs)

class SecondWindow(Screen):
    pass

class ThirdWindow(Screen):
    pass

class WindowManager(ScreenManager):
    pass

class mainApp(MDApp):
    def build(self):
        iconfonts.register('default_font', 'iconfonts\gar.ttf',
                           join(dirname(__file__), 'iconfonts\gar.fontd'))

        Config.set('graphics', 'width', '1080')
        Config.set('graphics', 'height', '720')
        return Builder.load_file("my.kv")


def de():
    mainApp().run()

def modbusStart():
    modbus.connect()

if __name__ == "__main__":

    a = Process(target=de)
    b = Process(target=modbusStart)
    a.start()
    b.start()

Screen looks like 当我运行此代码时,会再打开一个白色的窗口。我不知道为什么要打开以及如何修复它? 我认为这是关于屏幕管理器和 2.process 的。我尝试了所有组合来修复它,但我不能

【问题讨论】:

无法从那一点点代码中看出什么。请发帖minimal reproducible example。 【参考方案1】:

UbuntuWindows 10 上尝试类似您的代码后,我发现了一些奇怪的行为。首先,额外的Window 似乎只出现在Windows 上,并且只有在您导入MDApp 时才会出现。即使您只是导入MDApp,而没有实际使用它,也会发生额外的Window 行为。

我认为您发现了一个应该向kivyMD 开发人员报告的错误。

我能找到阻止额外 Window 行为的唯一方法是不使用(甚至不导入)MDApp

【讨论】:

谢谢你,当我尝试你的解决方案时,它的工作。我要举报【参考方案2】:

main.py

import modbus
from multiprocessing import Process, Queue, freeze_support
import kvy

def kivy():
    kvy.de()

def modbusStart():
    modbus.connect()

if __name__ == "__main__":
    a = Process(target=kivy)
    b = Process(target=modbusStart)
    a.start()
    b.start()

基维

from kivy.uix.screenmanager import ScreenManager,Screen,FadeTransition
from kivy.config import Config
from kivy.lang import Builder
from kivy.core.text import LabelBase
from kivymd.app import MDApp
from kivy.uix.image import Image
from kivy.uix.button import ButtonBehavior
from iconfonts import iconfonts
from os.path import join, dirname


class ImageButton(ButtonBehavior,Image):
    pass

class MainWindow(Screen):
    pass

class SecondWindow(Screen):
    pass

class ThirdWindow(Screen):
    pass

class WindowManager(ScreenManager):
    pass

class mainApp(MDApp):
    def build(self):
        iconfonts.register('default_font', 'iconfonts\gar.ttf',
                           join(dirname(__file__), 'iconfonts\gar.fontd'))
        LabelBase.register(name="prototype", fn_regular="font/Prototype.ttf")

        Config.set('graphics', 'width', '1080')
        Config.set('graphics', 'height', '720')
        return Builder.load_file("my.kv")

def de():
    mainApp().run()

Modbus

from pymodbus.client.sync import ModbusTcpClient

def connect():
    client = ModbusTcpClient("localhost")
    client.connect()
    if client.connect():
        print("Connection Successful")
    else:
        print("Conenction Failed")

【讨论】:

以上是关于Kivy-Python 在多处理中工作,再打开一个白屏的主要内容,如果未能解决你的问题,请参考以下文章

malloc 如何在多线程环境中工作?

如何让 TLinkLabel 在 Delphi 中工作?

消费者再平衡如何在 Kafka 中工作?

为啥 atprogram 不能在批处理文件中工作?

后台功能如何在处理中工作?

多处理 scikit-learn