我要做的只是让一些终端命令的输出打印到wx.TextCtrl小部件。我认为最简单的方法是创建一个自定义的stdout类,并将write函数重载到widget的那个。
stdout class:
class StdOut(sys.stdout):
def __init__(self,txtctrl):
sys.stdout.__init__(self)
self.txtctrl = txtctrl
def write(self,string):
self.txtctrl.write(string)
然后我会做以下事情:
sys.stdout = StdOut(createdTxtCtrl)
subprocess.Popen('echo "Hello World!"',stdout=sys.stdout,shell=True)
以下错误导致什么结果:
Traceback (most recent call last):
File "mainwindow.py", line 12, in <module>
from systemconsole import SystemConsole
File "systemconsole.py", line 4, in <module>
class StdOut(sys.stdout):
TypeError: Error when calling the metaclass bases
file() argument 2 must be string, not tuple
任何解决这个问题的想法都会受到赞赏。
答案 0 :(得分:13)
sys.stdout
不一个class
,它是实例(类型为file
)。
所以,就这样做:
class StdOut(object):
def __init__(self,txtctrl):
self.txtctrl = txtctrl
def write(self,string):
self.txtctrl.write(string)
sys.stdout = StdOut(the_text_ctrl)
无需继承file
,只需创建一个类似文件的简单对象! 鸭子打字是你的朋友......
(请注意,在Python中,与大多数其他OO语言一样,但与Javascript不同,您只能从类/类型的实例继承AKA类,从不; - 。)
答案 1 :(得分:0)
如果您需要实现的只是编写,则根本不需要定义新类。只需使用createdTxtCtrl
代替StdOut(createdTxtCtrl)
,因为前者已经支持您需要的操作。
如果您需要使用stdout只是指向某些程序的输出,而不是指向那里的所有类型的东西,请不要更改sys.stdout
,只需使用您自己的文件实例化subprocess.Popen
- 喜欢对象(createdTxtCtrl
)而不是sys.stdout
。
答案 2 :(得分:-1)
sys.stdout = StdOut(createdTxtCtrl)
不会产生周期性依赖吗?请勿尝试将sys.stdout
重新分配给从sys.stdout
派生的类。