我正在尝试在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。
答案 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)
您的代码中存在多处错误。您应该将问题分成微小的子任务,并独立完成每项任务。
subprocess.call()
返回一个整数(退出状态),而不是字符串(输出) - 启动Python REPL并尝试通过subprocess
运行任何命令并自己查看:它应该可以帮助您理解除了阅读链接文档之外还会发生什么。
如果您不介意阻止GUI线程,可以使用subprocess.check_output()
来获取输出 - 在子进程返回之前,任何内容都不会响应。
否则(如果i2cget
暂时没有返回),你可以do it asynchroniously using threads or .createfilehandler()
method。
x = print(output)
在Python中无用默认情况下,它是Python 2中的SyntaxError。否则print()
函数总是返回None
,即你可以写x = None
(除了将output
打印到stdout作为副作用)
StringVar()
as a textvariable
parameter .set(new_text)
to update the text