打印输出的子进程调用到标签tkinter

时间:2015-04-01 11:21:48

标签: python tkinter subprocess

我正在尝试在tkinter中创建一个GUI。 Gui基本上是Mcp23017。我正在尝试配置输入和输出引脚,以便用户可以根据自己的选择更改它们。还有一个选项可以使输入/输出高或低..

现在我正在尝试使用' i2cget'(使用单独的函数)读取一个引脚。我需要将这个子进程调用的输出显示在gui上的标签中。

这就是我的代码:

def read_p22():
   output = subprocess.call(['i2cget -y 0x20 0x12 0xFD'],shell=True)
   x=print (output)
   Label(tableframe,textvariable=x).grid(row=2,column=20)
   root.after(5000, read_p22)

当此功能执行时(通过按下按钮),它会打印一个值' 1'当我按下按钮时,在python shell上交替出现...我不知道如何将输出重定向到标签..有人可以建议吗?

更新::执行建议的命令时:

process = subprocess.Popen(['i2cget -y 0x20 0x12 0xFD'], stdout=PIPE,      stderr=PIPE, shell=True)
output, code = process.communicate()

我打印了'输出'和'处理'他们给了我相应的权利:

b'' <subprocess.Popen object at 0x00000000035CB2B0>

由于没有任何东西连接到引脚,我希望它返回一个&#39; 0的值...我不知道什么是b&#39;&#39;它给了我......

非常感谢任何建议。

亲切的问候, Namita。

2 个答案:

答案 0 :(得分:1)

你所拥有的是返回代码,而不是输出。

来自subprocess.call docs:

  

运行args描述的命令。等待命令完成,然后返回返回码属性

相反,使用subprocess.Popen打开一个进程,subprocess.PIPE将输出传递给您,Popen.communicate获取输出:

process = subprocess.Popen(['i2cget -y 0x20 0x12 0xFD'], stdout=PIPE, stderr=PIPE, shell=True)
output, code = process.communicate()
# do stuff with output...

答案 1 :(得分:1)

您的代码中存在多处错误。您应该将问题分成微小的子任务,并独立完成每项任务。

1。从Python

中获取子进程的输出作为字符串变量

subprocess.call()返回一个整数(退出状态),而不是字符串(输出) - 启动Python REPL并尝试通过subprocess运行任何命令并自己查看:它应该可以帮助您理解除了阅读链接文档之外还会发生什么。

如果您不介意阻止GUI线程,可以使用subprocess.check_output()来获取输出 - 在子进程返回之前,任何内容都不会响应。

否则(如果i2cget暂时没有返回),你可以do it asynchroniously using threads or .createfilehandler() method

2。了解为什么x = print(output)在Python中无用

默认情况下,它是Python 2中的SyntaxError。否则print()函数总是返回None,即你可以写x = None(除了将output打印到stdout作为副作用)

3。更新标签

中的文本