1
lyric 2013-01-16 18:33:59 +08:00 via Android
怎么个不一样法不说清楚
|
2
meecle OP @lyric ,我是在windows下执行的,正常情况执行结果是:"__main__ "(就是print __name__)
加了import xmlrpclib 这一句后,程序没有执行到print __name__这一行, 反而返回:“Socket ID = xxx” , 难道是xmlrpc 创建了网络socket? 要怎么才能让2个库可以同时使用呢? google的结果是 说用线程! 因为pygtk,有main event,但是用线程要怎么融合xmlrpc呢? |
3
lyric 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:如果你觉得有帮助不妨点一下感谢,手机打字好累 |
4
meecle 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 |
6
lyric 2013-01-17 10:07:54 +08:00
@meecle 嗯,gtk么。如果需要兼容别的平台,推荐还是Qt算了。
另外pygtk已经被废弃了,gtk3中,由于GObject Introspection的出现,需要使用 https://live.gnome.org/PyGObject |
7
meecle OP @lyric 谢谢提醒哈,QT太华丽了,总感觉离我太远了(喜好而已,呵呵),openerp的客户端用gtk做的,主要对这个也比较感兴趣,一方面完成工作,另外一方面想学习下,
|
8
ivenvd 2013-01-17 10:47:17 +08:00
@meecle 可以参考一下我这个简陋的实现(Python3 的): https://github.com/iven/Yaner/blob/master/yaner/Xmlrpc.py
|
9
BOYPT 2013-01-17 10:49:41 +08:00
... 网络通信放独立线程,有必要的话每个请求都开个线程。
|
10
meecle OP |
11
lyric 2013-01-17 12:24:53 +08:00
@meecle 咳咳...Qt只是给了你华丽的选择,你可以不用华丽...总之我提前告诉你Gtk是个大坑...这直接导致了所有Gtk based的程序的整体质量不如Qt based的
|
12
muzuiget 2013-01-17 13:04:38 +08:00
同意楼上,没啥特别要求建议还是 PyQt/PySide 吧。
|