如何使用kivy打印控制台输出

时间:2014-10-08 19:37:09

标签: python console-application kivy

我一直在努力学习如何使用Kivy python,我想 知道如何与Os控制台/终端交互以运行命令和 收到结果。到目前为止我看过的教程只展示了如何创建 窗口小部件,按钮等   例如,如何通过运行命令得到结果" uname" 显示在kivy。有了这样的代码如下。使用"按下"。如何让它与操作系统交互运行命令并将其显示在kivy应用程序中。是否有关于创建桌面应用程序/实用程序的教程

    from kivy.app import App
    from kivy.uix.button import Button

    class tutap(App):
        def build(self):
            return Button(text="Press here")

    tutap().run()

更新:     这是我想要实现的例子。这使用了easygui模块:

    import subprocess
    from easygui import *
    msg= "what you want"
    out = subprocess.check_output("uname -a",shell=True)
    title = "My choice"
    choices=["kernel version","nothing"]
    choice=boolbox(msg,title,choices)
    if choice==1:
        msgbox(out)
    elif choice==0:
        msgbox("The End")

3 个答案:

答案 0 :(得分:0)

我真的没有看到做这样的事情,但如果你想要你可以在单独的线程中调用App.run()方法,所以它不会阻止命令行。

使用cmd模块的示例:

import logging
logging.getLogger("kivy").disabled = True

from kivy.app import App
from kivy.uix.listview import ListView

from cmd import Cmd
from threading import Thread

class MyApp(App):
    def build(self):
        self.lv = ListView()
        return self.lv  

    def update(self, line):
        self.lv.adapter.data.append(line)
        return "list updated"

class MyCmd(Cmd, object):
    def __init__(self, app, *args):
        super(HelloWorld, self).__init__(*args)
        self.app = app

    def do_EOF(self, line):
        self.app.stop()
        return True

    def default(self, line):
        ret = self.app.update(line)
        print(ret)

if __name__ == '__main__':
    app = MyApp()
    Thread(target=app.run).start()
    MyCmd(app).cmdloop()

答案 1 :(得分:0)

这里我是如何获得控制台命令输出的。

首先是python代码:

    from kivy.app import App
    from kivy.uix.boxlayout import BoxLayout
    from kivy.uix.popup import Popup
    from kivy.properties import ObjectProperty
    from kivy.uix.label import Label 
    import subprocess

    class shellcommand(BoxLayout):
        first=ObjectProperty()
        second=ObjectProperty()
        third=ObjectProperty()

        def uname(self):
            v=subprocess.check_output("uname -a",shell=True)
            result=Popup(title="RESULT",content=Label(text="kernel is\n" + v))
            result.open()
        def date(self):
            d=subprocess.check_output("date",shell=True)
            res=Popup(title="DATE",content=Label(text="the date today is\n" + d))
            res.open()
        def last(self):
            last=subprocess.check_output("w",shell=True)
            ls=Popup(title="LOGIN",content=Label(text="logged in \n" + last))
            ls.open()


    class shellApp(App):
        def build(self):
            return shellcommand()

    shellApp().run()

然后是名为shellapp.kv的kivy文件

<shellcommand>:
orientation: "vertical"
first:one
second:two
third:three
canvas:
    Rectangle:
        source: "snaps.png" #location of any picture
        pos: self.pos
        size: self.size



BoxLayout:
    orientation: "horizontal"
    Button:
        id:one
        text: "UNAME"
        background_color: 0,0,0,1
        font_size:32
        size_hint:1,None
        on_press: root.uname()


    Button:
        id:two      
        text: "DATE"
        background_color: 1,1.5,0,1
        font_size:32
        size_hint:1,None
        on_press: root.date()


    Button:
        id: three
        text: "LOGGED IN"
        background_color: 1,0,0,1
        font_size:32
        size_hint: 1,None
        on_press: root.last()

如果有办法改进此代码,请告诉我如何操作。谢谢

答案 2 :(得分:0)

我能想到的最简单的方法就是创建一个函数来写入文件顶部的文件,如下所示

def printlog(message):
    with open('./log.txt','a') as f: f.write(message+"\n")

然后在您的程序中,如果您想要打印输出,只需放置printlog("whatever you wanted printed!")

该文件将保存在与程序相同的文件夹中。 理论上,你可以在程序运行时打开它,但这对于postmourtum来说更有用。