python 电路仿真spice_通过Python调用Spice-gtk

本文介绍了如何通过Python调用Spice-gtk进行电路仿真。首先,通过Virt Manager研究Spice gtk的Python方法,分析相关代码和信号处理。接着,深入研究SpiceViewer类,理解SpiceSession的使用步骤。最后,展示了一个简单的Python代码示例,用于创建Spice连接窗口。通过这个过程,读者可以学会如何利用Python进行电路仿真。
摘要由CSDN通过智能技术生成

序言

通过Virt Manager研究学习Spice gtk的Python方法

你将学到什么

Virt Manager研究

显示代码定位

首先我们使用Virt Manager来观察桌面连接窗口

然后我们使用glade打开Virt Manager源码目录下的ui目录下的文件进行比对,发现details.ui就是我们前面见到的窗口,对应的处理代码为details.py,并且我们知道对应的处理信号为on_control_vm_console_toggled

接着我们在details.py文件找到对应处理函数

# 绑定信号处理函数

"on_control_vm_console_toggled": self.details_console_changed,

# 处理函数核心逻辑

pages.set_current_page(DETAILS_PAGE_CONSOLE)

分析函数我们知道信号的处理逻辑就是切换到DETAILS_PAGE_CONSOLE页面,然后我们找到对应的页面知道对应的处理信号为on_console_pages_switch_page

查找信号对应的处理函数,我们知道最终的显示代码位于console.py中,继续分析UI文件,我们知道我们最终要关注的部件就是console-gfx-viewport,接下来我们来研究下console.py文件的vmmConsolePages类

vmmConsolePages类分析

首先分析类的初始化代码,我们发现如下注释

def __init__(self, vm, builder, topwin)

# Initialize display widget

self._viewer = None

很显然这个_viewer就是用作显示的widget,查找代码找到_viewer赋值处

def _init_viewer(self):

# 省略部分代码

try:

if ginfo.gtype == "vnc":

viewer_class = VNCViewer

elif ginfo.gtype == "spice":

if have_spice_gtk:

viewer_class = SpiceViewer

else:

raise RuntimeError("Error opening Spice console, "

"SpiceClientGtk missing")

self._viewer = viewer_class(self.vm, ginfo)

self._connect_viewer_signals()

self._refresh_enable_accel()

self._viewer.console_open()

except Exception, e:

logging.exception("Error connection to graphical console")

self._activate_unavailable_page(

_("Error connecting to graphical console") + ":\n%s" % e)

很显然SpiceViewer就是实现spice gtk调用的类,它位于viewers.py文件中,在研究这个类之前我们要先研究下传入的两个参数viewer_class(self.vm, ginfo),其中self.vm是一个vmmDomain类对象(位于domain.py文件),ginfo变量是一个ConnectionInfo类对象(位于sshtunnels.py文件)。ConnectionInfo类对象作用就是保存套接字服务端信息,vmmDomain类对象作用就是保存libvirt虚拟机信息。

SpiceViewer代码分析

首先我们来看下官方文档的描述

SpiceSession处理所有SpiceChannel连接,它同时还保存了连接信息比如服务器地址和端口。你也可以简单的设置"uri"比如 spice://127.0.0.1?port=5930 来设置你的连接信息。通过关联channel-new信号到SpiceSession对象,你将会收到连接就绪通知,并进行互动。比如SpiceInputsChannel准备就绪并且收到SPICE_CHANNEL_OPENED事件,你就可以通过spice_inputs_key_press()来发送按键事件;如果SpiceMainChannel处于可用状态,你就可以开始共享剪切板了等等。一旦SpiceSession对象属性设置完成,我们就能通过调用spice_session_connect()开始与Spice server的通信。

通过官网的描述使用SpiceSession的步骤如下:</

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值