我在开发一个软件,对于学习python的两个图形模块pygtk和pyqt,求点建议。 - V2EX
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
kehr
V2EX    Python

我在开发一个软件,对于学习python的两个图形模块pygtk和pyqt,求点建议。

  •  
  •   kehr
    kehr 2013-10-07 23:13:30 +08:00 6063 次点击
    这是一个创建于 4463 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我在用python开发一个小软件。用Tkinter做了个雏形。现在想用pygtk开发,而且已经着手学习。

    上官网查了一下资料,推荐使用PyGObject。目前在看The Python GTK+ 3 Tutorial,看了一半了,觉得参考的gtk api不好找,看个对象的方法还要去help(),用eclipse+pydev看的也不行,查了一下,模块是动态连接的.而且from gi.repository import Gtk还会报错,但不影响运行,或许这就是动态链接导致的吧。

    新手入门总是会遇到各种问题,作为学生党,目前这东西是一个人在搞,有点小困难(~傻笑~不过我喜欢~傻笑~)。

    由于The Python GTK+ 3 Tutorial,看了一半多了,还没找到PyGObject涉及的api for python参考手册,没法深入了解各个组件的方法和类说明,转过来看pyqt的话这几天的通宵努力就白费了。所以,希望由相关经验的前辈推荐些文档或书籍,最好是python api手册。

    还有就是,pyqt应该也很不错。目前The Python GTK+ 3 Tutorial完全能够帮我开发完成这个小软件。从学习的角度来说学习pyqt,会不会让自己贪多而不精呢?

    希望前辈推荐一些这方面的文档或者书籍,可以的话能指点一下学习路线更是感激不尽!
    8 条回复    1970-01-01 08:00:00 +08:00
    cooka
        1
    cooka  
       2013-10-07 23:33:52 +08:00   1
    pygtk在mac下比pyqt麻烦得多, 提醒一点.
    即使在windows下, 也是pyqt更方便, 虽然文件巨大.
    kehr
        2
    kehr  
    OP
       2013-10-08 07:59:51 +08:00
    @cooka 嗯,O(∩_∩)O谢谢~
    cxshun
        3
    cxshun  
       2013-10-08 09:22:46 +08:00   1
    pyqt应该是用得比较多的吧,而且感觉pyqt学习起来方便点,gtk貌似挺麻烦的。
    NahN2Regh
        4
    NahN2Regh  
       2013-10-08 19:16:27 +08:00   2
    如果没有必要支持windows系统的话, 推荐用PyGObject.

    gtk写起来很简单的, 尤其是gtk3, 引入了相当多的新功能, 绘制界面更给力! 还可以直接用CSS来定义软件的主题, 很灵活.
    在debian/ubuntu/fedora等系统里, 要做gtk的开发, 至少得安装这几个软件: devhelp用于查看API的, glade用于直接绘制软件界面的.

    glade是将界面转成了xml文件, gtk可以直接读取这类文件, 用GtkBuilder, GTkUIManger等;
    也可以手动来写界面的xml文件, 将像手写html文件那样, 刚才开始可能记不住, 但写几个之后就发现很容易;
    这两种方式设计的界面是跨语言的, C/C++/Python/Vala/...都是可直接用的.

    另外, 程序的样式可以单独放到一些CSS文件里.
    只用Python来实现程序的逻辑.

    这种方式就像写网页, 用html来做页面结构, CSS来控制样式, Javascript控制逻辑.

    当然了, 你也可以把所有的工作都用python来做, 比如软件界面用python一点点来绘制, 样式的话也是.

    还有, gtk里可以直接使用cairo, 强大的2D矢量绘图库, 几行代码就可以实现很酷的特效.

    我的PyGObject的开发经验是, 使用bpython3来查gtk的api, 因为bpython3支持自动补全, 可以直接显示widget的所有方法, 包括父类的方法. 没有完整的PyGObject API, 因为它与gtk的C API几乎完全一样, 我认为也没必要存在.
    我还用glade来设计软件的大致结构, 然后用python来实现.
    样式的话, 很少用, 因为gtk3(gnome)的默认主题已经很好了.

    我用vim来写的, F4直接运行, 如果发现了界面的问题, 直接关闭; 然后修改代码, 再F4, 再确认是否存在问题. 我很喜欢这种快速反馈的方法, 写网页时也是这样的流程, 开发速度非常高.

    参考资料:
    入门的话, 可以看这个http://python-gtk-3-tutorial.readthedocs.org/en/latest/
    cairo的: http://zetcode.com/gfx/pycairo/
    更详细的是翻看devhelp里的API.

    另一个技巧是, 用glade来尝试着设计, 然后需要修改一个widget的某个属性时, 可以在右下角的属性设置里右键, 会在devhelp中定位相应的API, 这很直观.


    推荐一个有人最近发布的酷我音乐盒的 PyGObject实现: https://github.com/LiuLang/kwplayer
    可以读一下他的代码.
    kehr
        5
    kehr  
    OP
       2013-10-09 03:53:07 +08:00
    @NahN2Regh 真的非常感谢您能抽出时间,传授这么多宝贵的经验。这对我的学习非常有帮助,再次感谢!软件的python部分已经开发完成,准备用您的方式重写一遍。
    NahN2Regh
        6
    NahN2Regh  
       2013-10-09 12:07:34 +08:00
    @kehr 不客气. 设计界面时有遇到什么问题了, 可以随时找我探讨, 大家共同进步嘛.[email][email protected][/email]

    真实的情况是, 我为了回答你这个问题, 才注册的v2ex帐号.
    g0t3n
        7
    g0t3n  
       2013-11-18 11:14:08 +08:00
    @NahN2Regh 怎么做到vim下 f4直接运行呢?还有就是本人想做个小东西能在linux,win下都能跑,感觉tkinter太轻量级了比如tree之类的没法做出来?没做过gui编程求教育
    kehr
        8
    kehr  
    OP
       2013-12-15 19:44:47 +08:00
    @g0t3n 对于你的第一个问题,你需要在vimrc中定义你的f4快捷键功能,我的是f5直接运行。这是我的编译部分vimrc代码供参考:
    "C,C++ 按F5编译运行
    map <F5> :call CompileFile()<CR>
    func! CompileFile()
    exec "w"
    if &filetype == 'c'
    exec "!gcc % -o %<"
    exec "! ./%<"
    elseif &filetype == 'cpp'
    exec "!g++ % -o %<"
    exec "! ./%<"
    elseif &filetype == 'java'
    exec "!javac %"
    exec "!java %<"
    elseif &filetype == 'sh'
    :!chmod u+x %; ./%
    elseif &filetype == 'python'
    exec "!python %"
    "自动执行Makefile
    lseif expand("%") == 'Makefile' || expand("%") == 'makefile'
    exec "!make"
    endif
    "编译或者执行文件后清屏
    if &filetype == 'c' || &filetype == 'cpp' || &filetype == 'java' || &filetype == 'sh' || &filetype == 'python' || expand("%") == 'Makefile'||expand("%") == 'makefile'
    exec "!clear"
    endif
    endfunc
    "C,C++的调试
    map <C-F5> :call Debug ()<CR>
    func! Debug()
    if &filetype == 'c'|| &filetype == 'cpp'
    exec "w"
    exec "!g++ % -g -o %<"
    exec "!gdb ./%<"
    else
    exec "!echo '+++++++++++++++++++++++++++++++++++++++++';echo '+ +';echo '+ 当前编辑的不是C或CPP文件,无法调试! +';echo '+ +';echo '+++++++++++++++++++++++++++++++++++++++++'"
    endif
    exec "!clear"
    endfun g
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1156 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 17:44 PVG 01:44 LAX 09:44 JFK 12:44
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86