|  |      1lyric      2013-01-16 18:33:59 +08:00 via Android 怎么个不一样法不说清楚 | 
|  |      2meecle OP @lyric ,我是在windows下执行的,正常情况执行结果是:"__main__ "(就是print __name__) 加了import xmlrpclib 这一句后,程序没有执行到print __name__这一行, 反而返回:“Socket ID = xxx” , 难道是xmlrpc 创建了网络socket? 要怎么才能让2个库可以同时使用呢? google的结果是 说用线程! 因为pygtk,有main event,但是用线程要怎么融合xmlrpc呢? | 
|  |      3lyric      2013-01-17 01:06:16 +08:00 via Android  2 @meecle 其实我没明白你到底想做啥。不过我猜测你是要做一个gtk的gui程序,程序调用xmlrpc对远程服务进行一些操作。 首先,xmlrpc当然要创建套接字否则怎么call 远程过程调用呢 其次,gtk的ui跑在一个独立的线程中的,因此你不能直接在ui线程的代码中直接发起xmlrpc,这样会导致ui线程挂起,程序假死(我没用过xmlrpc,但是我猜测它不是异步接口) 最后,你可能需要参考python文档关于线程的章节,以及这个gtk函数应该对你有帮助:gtk_idle_add (大概是这个记不清了) ps:如果你觉得有帮助不妨点一下感谢,手机打字好累 | 
|  |      4meecle OP @lyric 非常感谢,如你猜测,参考了官方的pygtk和 线程使用例子,修改了下,搞定 import threading import time import gobject import gtk gobject.threads_init() class MyThread(threading.Thread): def __init__(self, label): super(MyThread, self).__init__() self.label = label self.quit = False def update_label(self, counter): import xmlrpclib ‘’‘ 这里做 通过xmlrpc 获取数据 ’‘’ return False def run(self): counter = 0 gobject.idle_add(self.update_label, counter) w = gtk.Window() l = gtk.Label() w.add(l) w.show_all() w.connect("destroy", lambda _: gtk.main_quit()) t = MyThread(l) t.start() gtk.main() t.quit = True | 
|  |      6lyric      2013-01-17 10:07:54 +08:00 @meecle 嗯,gtk么。如果需要兼容别的平台,推荐还是Qt算了。 另外pygtk已经被废弃了,gtk3中,由于GObject Introspection的出现,需要使用 https://live.gnome.org/PyGObject | 
|  |      7meecle OP @lyric 谢谢提醒哈,QT太华丽了,总感觉离我太远了(喜好而已,呵呵),openerp的客户端用gtk做的,主要对这个也比较感兴趣,一方面完成工作,另外一方面想学习下, | 
|  |      8ivenvd      2013-01-17 10:47:17 +08:00 @meecle 可以参考一下我这个简陋的实现(Python3 的): https://github.com/iven/Yaner/blob/master/yaner/Xmlrpc.py | 
|      9BOYPT      2013-01-17 10:49:41 +08:00 ... 网络通信放独立线程,有必要的话每个请求都开个线程。 | 
|  |      10meecle OP | 
|  |      11lyric      2013-01-17 12:24:53 +08:00 @meecle 咳咳...Qt只是给了你华丽的选择,你可以不用华丽...总之我提前告诉你Gtk是个大坑...这直接导致了所有Gtk based的程序的整体质量不如Qt based的 | 
|  |      12muzuiget      2013-01-17 13:04:38 +08:00 同意楼上,没啥特别要求建议还是 PyQt/PySide 吧。 |