编写客户端程序使用 pygtk 和xmlrpclib ,怎么让这2个库可以同时使用?

2013-01-16 16:23:04 +08:00
 meecle
下面是pygtk文档中的代码:可以正常运行,

#!/usr/bin/env python
# example base.py
import pygtk
pygtk.require('2.0')
import gtk

class Base:
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.show()

def main(self):
gtk.main()

print __name__
if __name__ == "__main__":
base = Base()
base.main()


现在遇到问题是,我想加入 import xmlrpclib,仅仅是加入这一句,程序执行就不一样了,
请教下这方面的老手,或者给点线索都可以哈
3790 次点击
所在节点    Python
13 条回复
lyric
2013-01-16 18:33:59 +08:00
怎么个不一样法不说清楚
meecle
2013-01-16 20:35:12 +08:00
@lyric ,我是在windows下执行的,正常情况执行结果是:"__main__ "(就是print __name__)

加了import xmlrpclib 这一句后,程序没有执行到print __name__这一行, 反而返回:“Socket ID = xxx” , 难道是xmlrpc 创建了网络socket?

要怎么才能让2个库可以同时使用呢?
google的结果是 说用线程! 因为pygtk,有main event,但是用线程要怎么融合xmlrpc呢?
lyric
2013-01-17 01:06:16 +08:00
@meecle 其实我没明白你到底想做啥。不过我猜测你是要做一个gtk的gui程序,程序调用xmlrpc对远程服务进行一些操作。

首先,xmlrpc当然要创建套接字否则怎么call 远程过程调用呢

其次,gtk的ui跑在一个独立的线程中的,因此你不能直接在ui线程的代码中直接发起xmlrpc,这样会导致ui线程挂起,程序假死(我没用过xmlrpc,但是我猜测它不是异步接口)

最后,你可能需要参考python文档关于线程的章节,以及这个gtk函数应该对你有帮助:gtk_idle_add (大概是这个记不清了)

ps:如果你觉得有帮助不妨点一下感谢,手机打字好累
meecle
2013-01-17 09:50:14 +08:00
@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
meecle
2013-01-17 10:01:22 +08:00
@lyric 我现在做一个客户端,需要和magento的xmlrpc api交互,读取数据,然后用pygtk显示。
lyric
2013-01-17 10:07:54 +08:00
@meecle 嗯,gtk么。如果需要兼容别的平台,推荐还是Qt算了。

另外pygtk已经被废弃了,gtk3中,由于GObject Introspection的出现,需要使用 https://live.gnome.org/PyGObject
meecle
2013-01-17 10:39:22 +08:00
@lyric 谢谢提醒哈,QT太华丽了,总感觉离我太远了(喜好而已,呵呵),openerp的客户端用gtk做的,主要对这个也比较感兴趣,一方面完成工作,另外一方面想学习下,
ivenvd
2013-01-17 10:47:17 +08:00
@meecle 可以参考一下我这个简陋的实现(Python3 的): https://github.com/iven/Yaner/blob/master/yaner/Xmlrpc.py
BOYPT
2013-01-17 10:49:41 +08:00
... 网络通信放独立线程,有必要的话每个请求都开个线程。
meecle
2013-01-17 11:09:56 +08:00
@ivenvd 异步xmlrpc也是个解决方法,谢谢提醒,不过又要换成python 3,这升级啊,折腾人,又要把先前的程序测试下。
@BOYPT 线程这块是要好好设计下
lyric
2013-01-17 12:24:53 +08:00
@meecle 咳咳...Qt只是给了你华丽的选择,你可以不用华丽...总之我提前告诉你Gtk是个大坑...这直接导致了所有Gtk based的程序的整体质量不如Qt based的
muzuiget
2013-01-17 13:04:38 +08:00
同意楼上,没啥特别要求建议还是 PyQt/PySide 吧。
meecle
2013-01-18 09:19:02 +08:00
@muzuiget ,谢了,PySide试了下,感觉不错

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/57784

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX