andelf fledna Feather
2010年4月17日星期六
[IronPython]WPF应用的 STAThread 属性处理
最近用铁蟒写 WPF 应用, 遇到纠结的问题. (使用 tools/pyc.py 编译时会遇到, 解释执行正常)
任何一个 WPF 程序,Main 的前面都必须有 [STAThread] 属性, 否则会有运行时错误:
Unhandled Exception: System.InvalidOperationException: The calling thread must be STA, because many UI components require this.
找了下相关资料 发现有 http://www.ironpython.info/index.php/Setting_the_Clipboard
整了个还算 Pythonic 的方法, 这里和大家分享下
from System.Threading import Thread, ParameterizedThreadStart, \
ApartmentState, ThreadStart
def STAThread(main):
def new_main(*args, **kwargs):
t = Thread(ParameterizedThreadStart(main))
t.ApartmentState = ApartmentState.STA
t.Start(*args, **kwargs)
return new_main
这样, 可以直接使用 @STAThread 修饰主函数. 由于使用了 ParameterizedThreadStart, 主函数必须接受参数.
然后想到了版本2
def STAThread(main):
if main.__code__.co_argcount: # if main accept params
def new_main(*args, **kwargs):
t = Thread(ParameterizedThreadStart(main))
t.ApartmentState = ApartmentState.STA
t.Start(*args, **kwargs)
else:
def new_main():
t = Thread(ThreadStart(main))
t.ApartmentState = ApartmentState.STA
t.Start()
return new_main
需要注意的是, 如果主函数写在 class 里,那么 @STAThread 必须在 @staticmethod 之后, 原因..(如果你知道 @ 是什么意思的话).
或许有其他更好的方法, 欢迎讨论 :)
订阅:
博文评论 (Atom)
没有评论:
发表评论