代码之家  ›  专栏  ›  技术社区  ›  crystalattice

如何为cli python程序生成kivy GUI

  •  0
  • crystalattice  · 技术社区  · 6 年前

    我真的不知道怎么问这个问题,所以这是最有意义的。我有一个基于控制台的python程序,它模拟燃料储存和运输系统。( schematic drawing )

    这个 current program 没有什么特别的,只是使用阀门和泵实例来查看阀门是否打开/关闭,泵是否打开/关闭,以及设备之间的相关流量和压力。

    我想制作一个模拟人机界面的Kivy程序。在这种情况下,阀门旁边的简单切换按钮显示阀门是打开还是关闭,以及泵是打开还是关闭。

    我学习过Kivy的教程,读过一本Kivy的书,但他们没有回答我的问题,因为他们更关注的是移动游戏而不是桌面应用程序。我已经知道如何将按钮添加到示意图中,但我不知道如何使.py/.kv文件与我现有的python代码交互。如果可能的话,我不想重写我现有的代码。

    下面是到目前为止我所拥有的;它所做的只是在阀门1下面做一个切换按钮。按下时,按钮将“按下”一词发送到控制台输出。

    HMI.Py

    import kivy
    kivy.require("1.10.0")
    
    from kivy.app import App
    from kivy.uix.floatlayout import FloatLayout
    from kivy.config import Config
    from kivy.uix.togglebutton import ToggleButton, ToggleButtonBehavior
    
    Config.set("graphics", "width", "1062")
    Config.set("graphics", "height", "849")
    
    
    class HMI(FloatLayout):
        pass
    
    
    class HMIApp(App):
        def build(self):
            return HMI()
    
    
    if __name__ == "__main__":
        HMIApp().run()
    

    HMI.KV

    #:kivy 1.10.0
    
    <HMIButton@ToggleButton>:
        color: 1, 1, 1, 1
        size_hint: (.01, .01)
    
    <HMI>:
        canvas.before:
            Rectangle:
                pos: self.pos
                size: self.size
                source: "fuel_schematic.png"
        HMIButton:
            id: _valve_1
            text: "1"
            pos: 360, 285
            on_press: print("pressed")
    

    我的主要问题是,在virtualpc.models.fuelfarm.components.gate1和virtualpc.models.fuelfarm.functionality.gate1_open()[and close()]中使用阀门实例并将它们与我添加到kivy代码中的切换按钮相关联的最佳方法是什么?

    我可以简单地导入这些模块吗,还是必须将它们重写到kivy程序中?

    1 回复  |  直到 6 年前
        1
  •  1
  •   ikolim    6 年前

    ‘normal’ ‘down’

    1. on_press on_state ToggleButton on_state: root.on_state(self)
    2. group:

    HMIButton:
        id: _valve_1
        text: "1"
        pos: 360, 285
        group: "valve1"
        on_state: root.on_state(self)
    

    class HMI(FloatLayout):
    
        def on_state(self, instance):
            if instance.state == "down":
                print(instance.group, "Opened")
            else:
                print(instance.group, "Closed")