Gtk/Python和可移植性

4

程序员们如何编写可在多种发行版上运行的便携式UI代码?我考虑的是桌面发行版而不是专业/嵌入式发行版。对于编写UI应用程序来说,您必须假设某些东西作为标准或通过添加依赖项可用于平台。是否存在Linux发行版拥有的“最小”UI/widget标准?

当您编写代码时,Gnome与KDE发行版是如何参与进来的呢?

我有一个使用Gtk和Webkit的Python脚本。以下是脚本使用的导入:

import os
import threading
from gi.repository import WebKit 
from gi.repository import Gtk 
from gi.repository import GLib, GObject

在哪里可以找到关于我的代码能够在哪些Linux发行版上运行的最佳信息源呢?

2个回答

1

写跨发行版UI并不需要考虑太多内容。
实际上,我唯一记得的不兼容问题是:

托盘图标或通知区域或应用程序指示器(在Ubuntu中称为)
例如,标准托盘图标(通过gtk.StatusIcon创建)在Ubuntu的Unity中默认情况下无法使用
最好使用appindicator.Indicator,如果找到了appindicator模块,则可以使用,否则只需使用经典的StatusIcon

如果您过于关注程序的样式/主题,您可能会在其他环境中遇到问题,例如KDE
除非您使用适当的主题引擎作为桥梁,可以查看:
https://wiki.archlinux.org/index.php/Uniform_Look_for_Qt_and_GTK_Applications

为了了解发行版/操作系统,我编写了这样一个函数:

def getOsFullDesc():
    name = ''
    if os.path.isfile('/etc/lsb-release'):
        lines = open('/etc/lsb-release').read().split('\n')
        for line in lines:
            if line.startswith('DISTRIB_DESCRIPTION='):
                name = line.split('=')[1]
                if name[0]=='"' and name[-1]=='"':
                    return name[1:-1]
    if os.path.isfile('/suse/etc/SuSE-release'):
        return open('/suse/etc/SuSE-release').read().split('\n')[0]
    try:
        import platform
        return ' '.join(platform.dist()).strip().title()
        #return platform.platform().replace('-', ' ')
    except ImportError:
        pass
    if os.name=='posix':
        osType = os.getenv('OSTYPE')
        if osType!='':
            return osType
    ## sys.platform == 'linux2'
    return os.name

好的回答。涵盖了问题中隐含但未明确提问的要点。 - user871199

0

Python基本上是一种粘合语言 - 它本身并不做太多事情,但依赖于各种库,如pygtk、tkinter等,甚至是您自定义的C/C++模块。因此,逻辑上讲,您只需要为所需的库安装特定的依赖项:PyGTK和WebKit即可安装在目标机器上。

一旦您在Windows甚至MAC上安装了它们以及Python,Python将愉快地执行此代码,因为它所做的就是粘合!


Python 之所以采用这种方式的一个原因是它是解释执行而非编译执行。虽然这种模式有助于开发和跨平台兼容性,但对于性能来说并不是很好。因此,你只需在 Python 中编写初始骨架或粘合代码,并将性能敏感或操作系统相关的代码留给库和自定义模块。 - Prahlad Yeri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接