V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
meecle
V2EX  ›  Python

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

  •  
  •   meecle · 2013-01-16 16:23:04 +08:00 · 3602 次点击
    这是一个创建于 4118 天前的主题,其中的信息可能已经有所发展或是发生改变。
    下面是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,仅仅是加入这一句,程序执行就不一样了,
    请教下这方面的老手,或者给点线索都可以哈
    13 条回复    1970-01-01 08:00:00 +08:00
    lyric
        1
    lyric  
       2013-01-16 18:33:59 +08:00 via Android
    怎么个不一样法不说清楚
    meecle
        2
    meecle  
    OP
       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
        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:如果你觉得有帮助不妨点一下感谢,手机打字好累
    meecle
        4
    meecle  
    OP
       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
        5
    meecle  
    OP
       2013-01-17 10:01:22 +08:00
    @lyric 我现在做一个客户端,需要和magento的xmlrpc api交互,读取数据,然后用pygtk显示。
    lyric
        6
    lyric  
       2013-01-17 10:07:54 +08:00
    @meecle 嗯,gtk么。如果需要兼容别的平台,推荐还是Qt算了。

    另外pygtk已经被废弃了,gtk3中,由于GObject Introspection的出现,需要使用 https://live.gnome.org/PyGObject
    meecle
        7
    meecle  
    OP
       2013-01-17 10:39:22 +08:00
    @lyric 谢谢提醒哈,QT太华丽了,总感觉离我太远了(喜好而已,呵呵),openerp的客户端用gtk做的,主要对这个也比较感兴趣,一方面完成工作,另外一方面想学习下,
    ivenvd
        8
    ivenvd  
       2013-01-17 10:47:17 +08:00
    @meecle 可以参考一下我这个简陋的实现(Python3 的): https://github.com/iven/Yaner/blob/master/yaner/Xmlrpc.py
    BOYPT
        9
    BOYPT  
       2013-01-17 10:49:41 +08:00
    ... 网络通信放独立线程,有必要的话每个请求都开个线程。
    meecle
        10
    meecle  
    OP
       2013-01-17 11:09:56 +08:00
    @ivenvd 异步xmlrpc也是个解决方法,谢谢提醒,不过又要换成python 3,这升级啊,折腾人,又要把先前的程序测试下。
    @BOYPT 线程这块是要好好设计下
    lyric
        11
    lyric  
       2013-01-17 12:24:53 +08:00
    @meecle 咳咳...Qt只是给了你华丽的选择,你可以不用华丽...总之我提前告诉你Gtk是个大坑...这直接导致了所有Gtk based的程序的整体质量不如Qt based的
    muzuiget
        12
    muzuiget  
       2013-01-17 13:04:38 +08:00
    同意楼上,没啥特别要求建议还是 PyQt/PySide 吧。
    meecle
        13
    meecle  
    OP
       2013-01-18 09:19:02 +08:00
    @muzuiget ,谢了,PySide试了下,感觉不错
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2836 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 06:31 · PVG 14:31 · LAX 23:31 · JFK 02:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.