如何为CLI Python程序制作Kivy GUI

时间:2018-07-30 18:14:18

标签: python kivy

我不太确定如何问这个问题,所以这才是最合理的。我有一个基于控制台的Python程序,可以模拟燃料存储和传输系统(schematic drawing)。

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

我正在寻找一个可以模拟人机界面的Kivy程序。在这种情况下,只需在阀门旁边使用简单的切换按钮即可显示阀门是打开还是关闭,以及泵的开或关状态。

我已经阅读过Kivy教程并阅读了Kivy的书,但是它们并不能回答我的问题,因为他们倾向于更专注于移动游戏,而不是面向桌面的应用程序。我已经弄清楚了如何在原理图中添加按钮,但是我不知道如何使.py / .kv文件与我现有的Python代码进行交互。我根本不想重写我现有的代码。

以下是我到目前为止所拥有的;它所做的就是在阀门1下方制作一个ToggleButton。按下该按钮时,该按钮会将单词“ pressed”发送到控制台输出。

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")

我的主要问题是,在VirtualPLC.Models.FuelFarm.components.gate1和VirtualPLC.Models.FuelFarm.functionality.gate1_open()[以及close()]和将它们绑定到我添加到Kivy代码中的切换按钮上?

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

1 个答案:

答案 0 :(得分:1)

解决方案

当您触摸或单击ToggleButton小部件时,状态在‘normal’‘down’之间切换(与按下按钮的时间只有‘down’相对)。 / p>

是的,您可以导入这些模块。

kv文件

  1. on_press替换为on_state事件,并将其绑定到回调方法并传递ToggleButton的实例,例如on_state: root.on_state(self)
  2. 向每个ToggleButton添加group:,以便您知道它是哪个值。

摘要-kv

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

Python代码

在类HMI()中实现回调方法。

代码段-Python

class HMI(FloatLayout):

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