在Python中封装GObject模块进行图形化程序编程的教程

Python 是用于编码图形界面的极佳语言。由于可以迅速地编写工作代码并且不需要费时的编译周期, 所以可以立即使界面启动和运行起来,并且不久便可使用这些界面。 将这一点与 Python 易于链接本机库的能力结合起来,就可以形成一个出色的环境。

gnome-python 是为 Python 封装 GNOME 及其相关库的软件包。 这使您能够用 Python 编写外观与核心 GNOME 应用程序完全相同的应用程序,而所花的时间只是用 C 编写该应用程序所花的一部分。

然而,不用 C 进行编程会有一个缺点。大多数 GNOME 都是用 C 编写的,对于要在 Python 中使用的窗口小部件,必须将它们封装。 对于知道封装过程如何工作的人来说,这是一个快速任务,但它不是自动的, 除非窗口小部件属于核心 GNOME 库或者至少非常有用,否则将不会对它们进行封装。C 程序员可能必须编写更复杂的代码,但它们确实先做了这一步!

但并不一定是那样!虽然从传统上讲封装窗口小部件过程这一技术只有极少数人才知道,但它并不真的那么难。 如果您在发现新的窗口小部件时可以将它们封装,那么您就可以立刻在 Python 程序中使用它们。

本文将描述如何封装用 C 编码的 GObject(所有 GTK+ 窗口小部件和许多相关对象的最终基类), 以便可以从 Python 代码使用它。假设您的机器上安装了 gnome-python V1.99.x(如果没有安装, 请参阅 参考资料以获取链接)。如果您正在使用软件包,请确保安装了该开发软件包。 另外,还必须安装 Python 2.2 及其头文件。 假设您了解 Make、Python、GTK+ 2 和一些 C 方面的知识。

为了演示该过程,我将封装 EggTrayIcon ,它是用于在通知区中抽象表示图标的 GTK+ 窗口小部件。 该库在 GNOME CVS 中,位于 libegg 模块。在本文的结尾,我们将有一个名为 trayicon 的本机 Python 模块,它包含一个 TrayIcon 对象。

开始时,获得 eggtrayicon.c 和 eggtrayicon.h(其链接在本文结尾的 参考资料一节中),然后将它们放入新目录中。 应该在 automake 环境中构建该源文件(但我们将不在这种环境中), 所以或者除去这些文件中的 #include <config.h> ,或者创建一个名为 config.h 的空文件,然后创建一个空的 makefile;接下来,我们将填充它。
创建界面定义

该对象封装过程的第一步是创建 trayicon.defs,该文件为该对象指定 API。 定义文件是用一种类 Scheme 的语言编写的,虽然对于小型界面来说它们很容易生成, 但对于大型界面或初学者来说编写它们会很吃力。

gnome-python 与名为 h2def 的工具一起提供。该工具将解析头文件并生成粗略的定义文件。 注:因为它实际上并没有解析 C 代码,而只是使用正则表达式, 所以它的确要求传统格式化的 GObject,并且不能正确解析奇特格式化的 C 代码。

要生成初始定义文件,我们如下调用 h2def : python /usr/share/pygtk/2.0/codegen/h2def.py eggtrayicon.h > trayicon.defs

注:如果没有将 h2def.py 安装在 /usr 下,则必须更改该路径以指向它所在的地方。

如果我们现在查看已生成的定义文件,它应该具有某些意义。 该文件中含有类 EggTrayIcon 的定义、构造函数以及方法 send_message 和 cancel_message 。 该文件没有任何明显错误,我们不想除去任何方法或字段,所以我们不需编辑它。 注:该文件不是特定于 Python 的,其它语言绑定也可以使用它。

生成包装器

既然我们有了界面定义,那么就可以生成 Python 包装器的代码块。这包括生成一个覆盖文件。 覆盖文件告诉代码生成器要包括哪些头文件、模块名将是什么等等。

通过使用 %% 将覆盖文件分成多个节(以 lex/yacc 样式)。 这些节定义要包括哪些头文件、模块名、要包括哪些 Python 模块、要忽略哪些函数以及最后所有手工封装的函数。 下面是 trayicon 模块的初始覆盖文件。
清单 1. trayicon.override

%%
headers
#include <Python.h>
#include "pygobject.h"
#include "eggtrayicon.h"
%%
modulename trayicon
%%
import gtk.Plug as PyGtkPlug_Type
%%
ignore-glob
 *_get_type
%%

让我们再次更详细地检查该代码:

  headers
  #include <Python.h>
  #include "pygobject.h"
  #include "eggtrayicon.h"

这些是在构建包装器时要包括的头文件。 始终必需包括 Python.h 和 pygobject.h,当我们封装 eggtrayicon.h 时,我们也必需包括它们。

modulename trayicon

modulename 规范声明包装器将在什么模块中。

import gtk.Plug as PyGtkPlug_Type

这些是用于包装器的 Python 导入。请注意命名约定;对于要编译的模块,必须遵守它。 通常,导入对象的超类就足够了。例如,如果对象直接从 GObject 继承,则使用:

  import gobject.GObject as PyGObject_Type
  ignore-glob
  *_get_type

这是一个要忽略的函数名的 glob 模式(shell 样式的正则表达式)。Python 替我们处理了类型代码,因此我们忽略 *_get_type 函数;否则,将对它们进行封装。

既然我们构造了覆盖文件,那么就可以使用它来生成包装器。 gnome-python 绑定为生成包装器提供了一种神奇的工具, 我们可以随意使用它。 将下列内容添加到 makefile:
清单 2. 初始 makefile

再次详细说明:

  DEFS='pkg-config --variable=defsdir pygtk-2.0'

DEFS 是包含 Python GTK+ 绑定定义文件的路径。

  trayicon.c: trayicon.defs trayicon.override

生成的 C 代码取决于定义文件和覆盖文件。

 pygtk-codegen-2.0 --prefix trayicon \

这里调用 gnome-python 代码生成器。 prefix 参数被用作在已生成的代码内部的变量名的前缀。 您可以随意命名该参数,但使用模块名的话可使符号名保持一致。

  --register $(DEFS)/gdk-types.defs \
  --register $(DEFS)/gtk-types.defs \

模块使用 GLib 和 GTK+ 中的类型,所以我们还必须告诉代码生成器装入这些类型。

  --override trayicon.override \

该参数将我们创建的覆盖文件传递给代码生成器。

  trayicon.defs > $@

这里,代码生成器的最后一个选项是定义文件本身。 代码生成器在标准输出上进行输出,所以我们将它重定向到目标 trayicon.c。

如果我们现在运行 make trayicon.c ,然后查看已生成的文件, 那么我们会看到 C 代码包装 EggTrayIcon 中的每个函数。不必担心警告 No ArgType for GdkScreen*— 这是正常的。

正如您所看到的那样,封装代码看上去复杂,所以我们感谢代码生成器为我们编写的每一行。 稍后,我们将学习当想要调优封装时如何手工封装各个方法,而我们自己不必编写所有包装器。

创建模块

既然已经创建了包装器的代码块,那么就需要一个启动它的方法。 这涉及创建 trayiconmodule.c,该文件可被视为 Python 模块的 main() 函数。 该文件是样板文件代码(与覆盖文件相似),我们对它稍作修改。下面是我们将使用的 trayiconmodule.c:
清单 3. TrayIcon 模块代码

#include <pygobject.h>

void trayicon_register_classes (PyObject *d);
extern PyMethodDef trayicon_functions[];

DL_EXPORT(void)
inittrayicon(void)
{
  PyObject *m, *d;

  init_pygobject ();

  m = Py_InitModule ("trayicon", trayicon_functions);
  d = PyModule_GetDict (m);

  trayicon_register_classes (d);

  if (PyErr_Occurred ()) {
    Py_FatalError ("can't initialise module trayicon");
  }
}

这里需要说明一下一些细微的区别, 因为有多个使用单词 trayicon 的源代码。函数 inittrayicon 的名称和初始化模块的名称是 Python 模块的真实名称,因此是最终共享对象的名称。 数组 trayicon_functions 和函数 trayicon_register_classes 是根据代码生成器的 --prefix 参数命名的。正如前面所提到的那样,最好使这些名称保持一致,以便编码该文件不会变得很混乱。

尽管名称源可能存在混淆,但该 C 代码非常简单。 它初始化 GObject 和 trayicon 模块,然后向 Python 注册这些类。

现在我们有了所有代码块,就可以生成共享对象了。将以下内容添加到 makefile:
清单 4. makefile 附加代码部分

CFLAGS = 'pkg-config --cflags gtk+-2.0 pygtk-2.0' -I/usr/include/python2.2/ -I.
LDFLAGS = 'pkg-config --libs gtk+-2.0 pygtk-2.0'                  

trayicon.so: trayicon.o eggtrayicon.o trayiconmodule.o
  $(CC) $(LDFLAGS) -shared $^ -o $@

让我们再次逐行仔细检查:

  CFLAGS = 'pkg-config --cflags gtk+-2.0 pygtk-2.0' -I/usr/include/python2.2/ -I.

该行定义 C 编译标志。我们使用 pkg-config 来获取 GTK+ 和 PyGTK 的 include 路径。

 LDFLAGS = 'pkg-config --libs gtk+-2.0 pygtk-2.0'

该行定义链接程序标志。再次使用 pkg-config 来获取正确的库路径。

trayicon.so: trayicon.o eggtrayicon.o trayiconmodule.o

共享对象是根据生成的代码、我们刚才编写的模块代码以及 EggTrayIcon 的实现构造的。隐式规则根据我们创建的 .c 文件构建 .o 文件。

  $(CC) $(LDFLAGS) -shared $^ -o $@

这里我们构建最终的共享库。

现在运行 make trayicon.so 应该会根据定义生成 C 代码,编译三个 C 文件, 最后将它们全都链接在一起。做得不错 — 我们已经构建了第一个本机 Python 模块。 如果它没有编译和链接,请仔细检查这些阶段,并确保早先没有出现会引起稍后出错的警告。

既然我们有了 trayicon.so,就可以在 Python 程序中尝试并使用它。 开始时最好装入它,然后列出其成员。在 shell 中运行 python 以打开交互式解释器,然后输入以下命令。
清单 5. TrayIcon 的交互式测试

$ python
Python 2.2.2 (#1, Jan 18 2003, 10:18:59)
[GCC 3.2.2 20030109 (Debian prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pygtk
>>> pygtk.require("2.0")
>>> import trayicon
>>> dir (trayicon)
['TrayIcon', '__doc__', '__file__', '__name__']

希望从 dir 产生的结果与这里相同。现在我们准备开始一个更大的示例!
清单 6. Hello 示例

#! /usr/bin/python
import pygtk
pygtk.require("2.0")
import gtk
import trayicon
t = trayicon.TrayIcon("MyFirstTrayIcon")
t.add(gtk.Label("Hello"))
t.show_all()
gtk.main()

逐行细化它:

  #! /usr/bin/python
  import pygtk
  pygtk.require("2.0")
  import gtk
  import trayicon

这里,我们首先请求和导入 GTK+ 绑定,然后导入新模块。

  t = trayicon.TrayIcon("MyFirstTrayIcon")

现在创建 trayicon.TrayIcon 的实例。注:构造函数带有字符串参数 — 图标名称。

  t.add(gtk.Label("Hello"))

TrayIcon 元素是 GTK+ 容器,所以您可以将任何东西添加到其中。 这里,我添加一个标签窗口小部件。

  t.show_all()
  gtk.main()

这里,我将窗口小部件设置为可视的,然后启动 GTK+ 主事件循环。

现在,如果您还未这样做,则将 Notification Area applet 添加到 GNOME 面板(在该面板上单击鼠标右键,然后选择“Add to Panel”-> Utility -> Notification Area)。 运行该测试程序应该会在栏中显示“Hello”。很酷,不是吗?

通知区还允许我们做什么?好,程序可以告诉通知区显示消息。 该消息的实际显示方式是特定于实现的;目前,GNOME 通知区显示工具提示。 我们可以通过调用 send_message() 函数发送消息。快速查看 API 可以得知它希望有超时和消息, 所以它应该如下工作:

...
t = trayicon.TrayIcon("test")
...
t.send_message(1000, "My First Message")

但并不是那样。C 原型是 send_message(int timeout, char* message, int length) , 所以 Python API 还需要字符指针和长度。这确实起作用:

...
t = trayicon.TrayIcon("test")
...
message = "My First Message"
t.send_message(1000, message, len(message))

然而,这有点儿难看。这就是 Python;编程应该简单。 如果我们坚持沿着这条路线,那么将以 C 告终,但是没有分号。 幸运的是,在使用 gnome-python 代码生成器时,可以手工封装各个方法。

调优界面

到目前为止,我们已经有了 send_message(int timeout, char *message, int length) 函数。 如果 EggTrayIcon 的 Python API 允许我们调用 send_message(timeout, message) ,那会更好。幸运的是,这并不太难。

完成这一步将再次涉及编辑 trayicon.override。这正是文件名的意义所在:该文件主要包含手工覆盖的包装器函数。 比起演示一个示例并逐步说明其内容来,说明这些函数的工作原理要难得多,所以下面是手工封装的 send_message 代码。
清单 7. 手工覆盖

override egg_tray_icon_send_message kwargs
static PyObject*
_wrap_egg_tray_icon_send_message(PyGObject *self,
                 PyObject *args, PyObject *kwargs)
{
  static char *kwlist[] = {"timeout", "message", NULL};
  int timeout, len, ret;
  char *message;
  if (!PyArg_ParseTupleAndKeywords(args, kwargs,
                   "is#:TrayIcon.send_message", kwlist,
                   &timeout, &message, &len))
    return NULL;
  ret = egg_tray_icon_send_message(EGG_TRAY_ICON(self->obj),
                   timeout, message, len);
  return PyInt_FromLong(ret);
}

为了清晰起见,我们再次将该清单逐行细化:

  override egg_tray_icon_send_message kwargs

该行告诉代码生成器我们将提供 egg_tray_icon_send_message 的手工定义,它本身应该不会生成一个定义。

  static PyObject*
  _wrap_egg_tray_icon_send_message(PyGObject *self,
  PyObject *args, PyObject *kwargs)

这是 Python-to-C 桥的原型。它由正在对其调用方法的 GObject 的指针、参数数组和关键字参数数组组成。 返回值始终是 PyObject* ,因为 Python 中的所有值都是对象(甚至整数)。

  {
  static char *kwlist[] = {"timeout", "message", NULL};
  int timeout, len, ret;
  char *message;

该数组定义该函数接受的关键字参数的名称。 提供使用关键字参数的能力不是必需的,但它可以使带有许多参数的代码变得清楚许多,而且不需要大量的额外工作。

  if (!PyArg_ParseTupleAndKeywords(args, kwargs,
  "is#:TrayIcon.send_message", kwlist,
  &timeout, &message, &len))
  return NULL;

这个复杂的函数调用执行参数解析。我们向它提供所知道的关键字参数以及所有给定参数的列表, 它将设置最终参数指向的值。那个看上去费解的字符串声明了所需要的变量类型,我们稍后将说明它。

  ret = egg_tray_icon_send_message(EGG_TRAY_ICON(self->obj),
  timeout, message, len);
  return PyInt_FromLong(ret);
  }

这里,我们实际上调用 egg_tray_icon_send_message ,然后将返回的 int 转换成 PyObject 。

起先这看上去有点可怕,但它最初是从 trayicon.c 中的生成代码复制来的。 在大多数情况下,如果您只想调优所需要的参数,那么这是完全有可能的。 只要从生成的 C 中复制并粘贴相关函数,添加有魔力的覆盖行并编辑该代码, 直到它如您所愿。

最重要的更改是修改所需要的参数。 PyArg_ParseTupleAndKeywords 函数中看上去费解的字符串定义了所需要的参数。 最初,它是 isi:TrayIcon.send_message ;这意味着参数依次是 int 、 char* (s 表示字符串)和 int ; 而且如果抛出一个异常,则该函数称作 TrayIcon.send_message 。 我们不想必须在 Python 代码中指定字符串长度,所以将 isi 更改为 is# 。使用 s# 来代替 s 意味着 PyArg_ParseTupleAndKeywords 将自动计算字符串长度并为我们设置另一个变量 — 这正是我们想要的。

要使用新的包装器,只需重新构建共享对象并将测试程序中的 send_message 调用更改成:

t.send_message(1000, message)

如果每件事情都照常进行,那么这个修改后的示例应该有相同的行为,但具有更清晰的代码。

结束游戏

我们采用了小型的但有用的 C GObject,封装它,这样就可以在 Python 中使用它, 甚至可以对包装器进行度身定做以符合我们的需要。这里的技术可以多次应用于不同对象, 允许您使用在 Python 中找到的任何 GObject。

(0)

相关推荐

  • python开发之tkinter实现图形随鼠标移动的方法

    本文实例讲述了python开发之tkinter实现图形随鼠标移动的方法.分享给大家供大家参考,具体如下: 做这个东西的时候,灵感源自于一个js效果: 两个眼睛随鼠标移动而移动 运行效果: 代码部分: from tkinter import * #1.获取到小圆当前的圆心坐标(x1, y1) #2.获取到小圆移动的圆心坐标(x2, y2) #3.把小圆从坐标(x1, y1)移动到坐标(x2, y2) __author__ = {'name' : 'Hongten', 'mail' : 'hongt

  • 用PyQt进行Python图形界面的程序的开发的入门指引

    一般来说,选择用于应用程序的 GUI 工具箱会是一件棘手的事.使用 Python(许多语言也一样)的程序员可以选择的 GUI 工具箱种类繁多,而每个工具箱都有各自的优缺点.有些速度比其它工具箱快,有些比较小:有些易于安装,有些更适合于跨平台使用(对于这一点,还要指出,有些支持您需要满足的特定特性).当然,各种库都相应具有各种许可证. 对于 Python 程序员而言,缺省的 GUI 选择是 Tk(通过 Tkinter 绑定)- 其原因显而易见.Tkinter 和闲置的 IDE 是由 Python

  • 使用Python制作获取网站目录的图形化程序

    1.pyqt4写的界面 find_ui.py #-*- coding: utf-8 -*- from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s try: _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(context, text, dis

  • 为Python程序添加图形化界面的教程

    Python支持多种图形界面的第三方库,包括: Tk wxWidgets Qt GTK 等等. 但是Python自带的库是支持Tk的Tkinter,使用Tkinter,无需安装任何包,就可以直接使用.本章简单介绍如何使用Tkinter进行GUI编程. Tkinter 我们来梳理一下概念: 我们编写的Python代码会调用内置的Tkinter,Tkinter封装了访问Tk的接口: Tk是一个图形库,支持多个操作系统,使用Tcl语言开发: Tk会调用操作系统提供的本地GUI接口,完成最终的GUI.

  • 利用aardio给python编写图形界面

    前阵子在用python写一些小程序,写完后就开始思考怎么给python程序配一个图形界面,毕竟控制台实在太丑陋了. 于是百度了下python的图形界面库,眼花缭乱的一整页,拣了几件有"特色"有"噱头"的下载下来做了个demo,仍旧不是很满意,不是下载安装繁琐,就是界面丑陋或者难写难用,文档不齐全. 后来那天,整理电脑文件发现了6年前下载的aatuo(现已更名aardio),顿时一阵惊喜. 先说说aardio,2011年7月的时候,它还叫aauto,那时的自己还醉心于

  • 利用QT写一个极简单的图形化Python闹钟程序

    今天我们讲一下用Python写的GUI小程序.一个小闹钟(只是屏幕提示,没有声音哦) 让我们先介绍这个闹钟如何奇葩. 需要通过命令行启动. 没有标题栏. 没菜单. 甚至没有关闭按钮. 没有运行界面. 看到这里想必大家要问了,何必去做一个这样弱爆了的程序呢.显然,教育意义大于其实际用处. 像其他的模块一样,QT界面包是需要加载的. 我们用到了命令行输入,所以,sys模块也是必须的. 用到了时间,但是我们不需要使用time模块,我们用QT提供的QTime模块. 让我们先写import 语句部分. i

  • 在Python中封装GObject模块进行图形化程序编程的教程

    Python 是用于编码图形界面的极佳语言.由于可以迅速地编写工作代码并且不需要费时的编译周期, 所以可以立即使界面启动和运行起来,并且不久便可使用这些界面. 将这一点与 Python 易于链接本机库的能力结合起来,就可以形成一个出色的环境. gnome-python 是为 Python 封装 GNOME 及其相关库的软件包. 这使您能够用 Python 编写外观与核心 GNOME 应用程序完全相同的应用程序,而所花的时间只是用 C 编写该应用程序所花的一部分. 然而,不用 C 进行编程会有一个

  • Python中使用matplotlib模块errorbar函数绘制误差棒图实例代码

    目录 1.基本参数 2.代码实现 3.结果显示 4.更多参数请参考matplotlib官网 总结 Python的matplotlib模块中的errorbar函数可以绘制误差棒图,本次主要绘制不带折线的误差棒图. 1.基本参数 errorbar函数的基本参数主要有: x,y:主要定于二维数据的横纵坐标值 yerr :定义y轴方向的误差棒的大小,可以是一个数,也可以是二维数组(分别传递平均值与最小值的差和最大值与平均值的差). xerr:定义y轴方向的误差棒的大小,同样也可以是一个数,也可以是二维数

  • python中使用paramiko模块并实现远程连接服务器执行上传下载功能

    paramiko模块 paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,如Linux, Solaris, BSD, MacOS X, Windows等,paramiko都可以支持,因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系列的操作时,par

  • Python中使用select模块实现非阻塞的IO

    Socket的英文原义是"孔"或"插座".作为BSD UNIX的进程通信机制,取后一种意思.通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.在Internet上的主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务.Socket正如其英文原意那样,像一个多孔插座.一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110

  • 深入理解python中的select模块

    简介 Python中的select模块专注于I/O多路复用,提供了select  poll  epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqueue方法(freeBSD系统) select方法 进程指定内核监听哪些文件描述符(最多监听1024个fd)的哪些事件,当没有文件描述符事件发生时,进程被阻塞:当一个或者多个文件描述符事件发生时,进程被唤醒. 当我们调用select()时: 1.上下文切换转换为内核态 2.将fd从用户空间复制到内核空

  • 使用Python中的tkinter模块作图的方法

    python简述: Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.自从20世纪90年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程.Python[1]已经成为最受欢迎的程序设计语言之一.2011年1月,它被TIOBE编程语言排行榜评为2010年度语言.自从2004年以后,python的使用率是呈线性增长. tkinter模块介绍 tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以

  • python中利用h5py模块读取h5文件中的主键方法

    如下所示: import h5py import numpy as np #HDF5的写入: imgData = np.zeros((2,4)) f = h5py.File('HDF5_FILE.h5','w') #创建一个h5文件,文件指针是f f['data'] = imgData #将数据写入文件的主键data下面 f['labels'] = np.array([1,2,3,4,5]) #将数据写入文件的主键labels下面 f.close() #关闭文件 #HDF5的读取: f = h5

  • 详解python中的hashlib模块的使用

    hashlib hashlib主要提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256, sha384, sha512等算法 hashlib模块 #哈希算法也叫摘要算法,相同的数据始终得到相同的输出,不同的数据得到不同的输出. #(1)哈希将不可变的任意长度的数据,变成具有固定长度的唯一值 #(2)字典的键值对映射关系是通过哈希计算的,哈希存储的数据是散列(无序) # 应用场景:在需要效验功能时使用  用户密码的 => 加密,解密  相关效验的

  • 在Python中合并字典模块ChainMap的隐藏坑【推荐】

    在Python中,当我们有两个字典需要合并的时候,可以使用字典的 update 方法,例如: a = {'a': 1, 'b': 2} b = {'x': 3, 'y': 4} a.update(b) print(a) 运行效果如下图所示: 然而,这个方法有一个问题--它会改变其中一个字典.如果我们不想改变原有的两个字典,那么我们必需要单独再创建一个字典: a = {'a': 1, 'b': 2} b = {'x': 3, 'y': 4} c = dict(a) c.update(b) prin

随机推荐