<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>鬼の领地 &#187; 鼠标</title>
	<atom:link href="http://blog.upsuper.org/tag/%e9%bc%a0%e6%a0%87/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.upsuper.org</link>
	<description>the place where there are some ghost appearing...</description>
	<lastBuildDate>Wed, 19 Oct 2011 13:21:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>鼠标控制音乐播放的小程序</title>
		<link>http://blog.upsuper.org/a-little-program-for-music-player-control-by-mouse/</link>
		<comments>http://blog.upsuper.org/a-little-program-for-music-player-control-by-mouse/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 12:06:03 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[D-Bus]]></category>
		<category><![CDATA[gtk]]></category>
		<category><![CDATA[Netbook]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[音乐]]></category>
		<category><![CDATA[鼠标]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=895</guid>
		<description><![CDATA[看这个标题一定很奇怪：难道我以前控制音乐播放不用鼠标么？这个文章的标题看起来像鼠标刚刚发明的推广期的文章……不过，当然不是这样的！ 其实只是想：如何把我的小本合上放书架上，当作一个音乐播放器+功放，并用我的无线6键鼠当遥控器遥控控制之。 想想其实还是蛮有意义的功能，这样我做作业的时候可以不用戴耳机，不用用MP3，直接把本当播放器；同时，我不会看到屏幕上的东西，可以安心做作业~再看看我的6键无限鼠，那额外的功能键平时根本不用，也想不出能有什么用……这么好的东西就这样被我浪费了……（话说，拿本当音乐播放器是不是更浪费？） 说干就干！ 首先提出构想：左键用于暂停和播放，滚轮调节音量，侧边的两个功能键用来切换上一首和下一首。至于右键和中键……再说吧，说不定以后可以扩展更多功能？说不定以后高兴了弄个鼠标手势什么的~嘿嘿 接下来查找资料。印象中我的 Audacious 是可以用 D-Bus 控制的。简单地查阅了一下相关资料，发现了一个叫做 MPRIS 的播放器控制接口。为此，我还专门学习了一下 python-dbus 的使用。 插一句话：python-dbus 怎么没有中文教程啊！英文教程看得还是蛮吃力的…… 连接播放器的代码很简单： 1 2 3 import dbus bus = dbus.SessionBus&#40;&#41; player = bus.get_object&#40;'org.mpris.audacious', '/Player'&#41; 其中 org.mpris.audacious 指的是 audacious，支持 MPRIS 的其他播放器还可以有如下： org.mpris.bmp org.mpris.vlc org.mpris.xmms2 至于那个 /Player 指的是我们要获取的是一个叫 Player 的对象，用于控制播放器。在 MPRIS 中除了 Player 以外，还有根对象 (&#8216;/&#8217;) 和 TrackList 对象 (&#8216;/TrackList&#8217;) 两个，具体的用法其文档里详细说明。这里我只用到了 Player 对象…… [...]]]></description>
			<content:encoded><![CDATA[<p>看这个标题一定很奇怪：难道我以前控制音乐播放不用鼠标么？这个文章的标题看起来像鼠标刚刚发明的推广期的文章……不过，当然不是这样的！</p>
<p>其实只是想：如何把我的小本合上放书架上，当作一个音乐播放器+功放，并用我的无线6键鼠当遥控器遥控控制之。</p>
<p>想想其实还是蛮有意义的功能，这样我做作业的时候可以不用戴耳机，不用用MP3，直接把本当播放器；同时，我不会看到屏幕上的东西，可以安心做作业~再看看我的6键无限鼠，那额外的功能键平时根本不用，也想不出能有什么用……这么好的东西就这样被我浪费了……（话说，拿本当音乐播放器是不是更浪费？）</p>
<p>说干就干！<br />
<span id="more-895"></span><br />
首先提出构想：左键用于暂停和播放，滚轮调节音量，侧边的两个功能键用来切换上一首和下一首。至于右键和中键……再说吧，说不定以后可以扩展更多功能？说不定以后高兴了弄个鼠标手势什么的~嘿嘿</p>
<p>接下来查找资料。印象中我的 Audacious 是可以用 D-Bus 控制的。简单地查阅了一下相关资料，发现了一个叫做 <a href="http://wiki.xmms2.xmms.se/wiki/Media_Player_Interfaces">MPRIS</a> 的播放器控制接口。为此，我还专门学习了一下 <a href="http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html">python-dbus</a> 的使用。</p>
<p>插一句话：python-dbus 怎么没有中文教程啊！英文教程看得还是蛮吃力的……</p>
<p>连接播放器的代码很简单：</p>

<div class="wp_codebox"><table><tr id="p89512"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p895code12"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> dbus
bus = dbus.<span style="color: black;">SessionBus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
player = bus.<span style="color: black;">get_object</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'org.mpris.audacious'</span>, <span style="color: #483d8b;">'/Player'</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>其中 org.mpris.audacious 指的是 audacious，支持 MPRIS 的其他播放器还可以有如下：</p>
<ul>
<li>org.mpris.bmp</li>
<li>org.mpris.vlc</li>
<li>org.mpris.xmms2</li>
</ul>
<p>至于那个 /Player 指的是我们要获取的是一个叫 Player 的对象，用于控制播放器。在 MPRIS 中除了 Player 以外，还有根对象 (&#8216;/&#8217;) 和 TrackList 对象 (&#8216;/TrackList&#8217;) 两个，具体的用法其文档里详细说明。这里我只用到了 Player 对象……</p>
<p>看看 Player 对象的方法还挺多，这里我用了这几个：</p>
<ul>
<li>Next() &#8211; 切换到下一首歌曲</li>
<li>Prev() &#8211; 切换到上一首歌曲</li>
<li>Pause() &#8211; 暂停/继续</li>
<li>Play() &#8211; 播放歌曲</li>
<li>VolumeGet() &#8211; 获取当前音量</li>
<li>VolumeSet() &#8211; 设置音量</li>
</ul>
<p>根据前面写的需求，这些已经足够了~</p>
<p>怎么用这些？很简单嘛！就像平时在 Python 里面调用类的方法一样~类型转换？不，那完全不需要你关心！</p>
<p>Python 程序拥有控制播放器的能力了，可是鼠标呢？如何捕获鼠标的动作呢？</p>
<p>想想……屏幕都关了……你还能指望他为你显示什么呢？干脆建立一个窗口把整个屏幕盖住算了！然后让他截获鼠标事件。</p>
<p>快速学习了一下 pygtk 的用法（其实就是照着 Hello World 打了一遍），差不多就知道怎么用了。窗口的建立代码大约如下：</p>

<div class="wp_codebox"><table><tr id="p89513"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p895code13"><pre class="python" style="font-family:monospace;">window = gtk.<span style="color: black;">Window</span><span style="color: black;">&#40;</span>gtk.<span style="color: black;">WINDOW_TOPLEVEL</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">fullscreen</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
gtk.<span style="color: black;">main</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>这段代码很好理解了，第一行就是创建窗口对象，第二行令其全屏，第三行设置其显示，第四行开始 GTK 的主循环。</p>
<p>下面就是鼠标事件的问题了~添加事件用的是类似下面的代码：</p>

<div class="wp_codebox"><table><tr id="p89514"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p895code14"><pre class="python" style="font-family:monospace;">window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'key-press-event'</span>, key_press<span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'destroy'</span>, <span style="color: #ff7700;font-weight:bold;">lambda</span> widget, data = <span style="color: #008000;">None</span>: gtk.<span style="color: black;">main_quit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>第一个是注册了键盘按键的事件捕获，将 key-press-event 事件绑定上 key_press 这个函数，而把窗口的销毁事件 destroy 连接到退出 GTK 主循环。说一句废话，连接事件的语句要放在 gtk.main() 之前……key_press 主要用来实现当点击 escape 时退出：</p>

<div class="wp_codebox"><table><tr id="p89515"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p895code15"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> key_press<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> gdk.<span style="color: black;">keyval_name</span><span style="color: black;">&#40;</span>event.<span style="color: black;">keyval</span><span style="color: black;">&#41;</span> == <span style="color: #483d8b;">'Escape'</span>:
    window.<span style="color: black;">destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>好了，下面是鼠标点击事件 button-press-event：</p>

<div class="wp_codebox"><table><tr id="p89516"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p895code16"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> button_press<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">print</span> event
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'button-press-event'</span>, button_press<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>试试？不行的！差了一番后，发现 Window 这个东西默认是不打开鼠标点击的事件捕获的，逼近大家很少会点窗口本身，都是点里面的按钮什么的……下面的代码要求窗口打开鼠标点击事件的捕获：</p>

<div class="wp_codebox"><table><tr id="p89517"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p895code17"><pre class="python" style="font-family:monospace;">window.<span style="color: black;">add_events</span><span style="color: black;">&#40;</span>gtk.<span style="color: black;">gdk</span>.<span style="color: black;">BUTTON_PRESS_MASK</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>接下来就可以了~event.button 表示的是点击的键是哪个。检查了一下，左键是1，右键是3，中键是2，功能键1是8，功能键2是9。滚轮呢？</p>
<p>原来滚轮有自己的事件 scroll。</p>

<div class="wp_codebox"><table><tr id="p89518"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p895code18"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> scroll<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">print</span> event
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'scroll-event'</span>, scroll<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>直接可以用了。识别滚轮方向的是 event.direction，应该是 gtk.gdk.SCROLL_UP、SCROLL_DOWN、SCROLL_LEFT、SCROLL_RIGHT 其中的一个。</p>
<p>下面根据最初的设想，把他们都拼起来就形成了最初的版本：</p>

<div class="wp_codebox"><table><tr id="p89519"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
</pre></td><td class="code" id="p895code19"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> pygtk
pygtk.<span style="color: black;">require</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'2.0'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">import</span> gtk
<span style="color: #ff7700;font-weight:bold;">from</span> gtk <span style="color: #ff7700;font-weight:bold;">import</span> gdk
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> dbus
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> button_press<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  button = event.<span style="color: black;">button</span>
  <span style="color: #ff7700;font-weight:bold;">if</span> button == <span style="color: #ff4500;">1</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> player.<span style="color: black;">GetStatus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == <span style="color: #ff4500;">2</span>:
      player.<span style="color: black;">Play</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
      player.<span style="color: black;">Pause</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #ff4500;">9</span>:
    player.<span style="color: black;">Prev</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #ff4500;">8</span>:
    player.<span style="color: black;">Next</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> scroll<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: black;">direction</span> == gdk.<span style="color: black;">SCROLL_UP</span>:
    player.<span style="color: black;">VolumeSet</span><span style="color: black;">&#40;</span>player.<span style="color: black;">VolumeGet</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> + <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> event.<span style="color: black;">direction</span> == gdk.<span style="color: black;">SCROLL_DOWN</span>:
    player.<span style="color: black;">VolumeSet</span><span style="color: black;">&#40;</span>player.<span style="color: black;">VolumeGet</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> - <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> key_press<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> gdk.<span style="color: black;">keyval_name</span><span style="color: black;">&#40;</span>event.<span style="color: black;">keyval</span><span style="color: black;">&#41;</span> == <span style="color: #483d8b;">'Escape'</span>:
    window.<span style="color: black;">destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
bus = dbus.<span style="color: black;">SessionBus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
player = bus.<span style="color: black;">get_object</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'org.mpris.audacious'</span>, <span style="color: #483d8b;">'/Player'</span><span style="color: black;">&#41;</span>
&nbsp;
window = gtk.<span style="color: black;">Window</span><span style="color: black;">&#40;</span>gtk.<span style="color: black;">WINDOW_TOPLEVEL</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'destroy'</span>, <span style="color: #ff7700;font-weight:bold;">lambda</span> widget, data = <span style="color: #008000;">None</span>: gtk.<span style="color: black;">main_quit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">add_events</span><span style="color: black;">&#40;</span>gdk.<span style="color: black;">BUTTON_PRESS_MASK</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'button-press-event'</span>, button_press<span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'key-press-event'</span>, key_press<span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'scroll-event'</span>, scroll<span style="color: black;">&#41;</span>
window.<span style="color: black;">fullscreen</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
gtk.<span style="color: black;">main</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>OK 看起来不错了，也能控制了。可是，作为一个程序员，怎么能不考虑各种意外呢？试想，如果我们控制着控制着，突然，一个不明真相的窗口弹了出来怎么办呢？！这是一个问题……</p>
<p>最容易想到的方法：把这个窗口永久置顶！</p>
<p>事实上也确实找到了这么个方法，就是把窗体注册成 dock。我们知道 dock 是需要永久置顶的~</p>
<p>用如下方法可以让窗体变成 Dock：</p>

<div class="wp_codebox"><table><tr id="p89520"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p895code20"><pre class="python" style="font-family:monospace;">window.<span style="color: black;">set_type_hint</span><span style="color: black;">&#40;</span>gtk.<span style="color: black;">gdk</span>.<span style="color: black;">WINDOW_TYPE_HINT_DOCK</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>但是问题又来了：dock 似乎没法接受键盘输入。因为 dock 只是形式上覆盖，并且可以拦截一切在他上面发生的鼠标事件，可键盘焦点就未必在他那里了~</p>
<p>那么我们就不要键盘事件了吧~于是我就把键盘退出给删了，改成了双击退出~查了下资料，双击事件也通过 button-press-event 发送的，必须根据 event.type 来判断是单击、双击还是三击。此外，双击和三击中的每一次点击都会引发一次单击事件。</p>
<p>OK，于是我们把 button_press 函数改成下面这样：</p>

<div class="wp_codebox"><table><tr id="p89521"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code" id="p895code21"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> button_press<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: #008000;">type</span> == gdk._2BUTTON_PRESS:
    window.<span style="color: black;">destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> event.<span style="color: #008000;">type</span> == gdk._3BUTTON_PRESS:
    <span style="color: #ff7700;font-weight:bold;">return</span>
  button = event.<span style="color: black;">button</span>
  <span style="color: #ff7700;font-weight:bold;">if</span> button == <span style="color: #ff4500;">1</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> player.<span style="color: black;">GetStatus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == <span style="color: #ff4500;">2</span>:
      player.<span style="color: black;">Play</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
      player.<span style="color: black;">Pause</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #ff4500;">9</span>:
    player.<span style="color: black;">Prev</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #ff4500;">8</span>:
    player.<span style="color: black;">Next</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>然后删掉键盘处理，最后就成了这样：</p>

<div class="wp_codebox"><table><tr id="p89522"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
</pre></td><td class="code" id="p895code22"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> pygtk
pygtk.<span style="color: black;">require</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'2.0'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">import</span> gtk
<span style="color: #ff7700;font-weight:bold;">from</span> gtk <span style="color: #ff7700;font-weight:bold;">import</span> gdk
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> dbus
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> button_press<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: #008000;">type</span> == gdk._2BUTTON_PRESS:
    window.<span style="color: black;">destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> event.<span style="color: #008000;">type</span> == gdk._3BUTTON_PRESS:
    <span style="color: #ff7700;font-weight:bold;">return</span>
  button = event.<span style="color: black;">button</span>
  <span style="color: #ff7700;font-weight:bold;">if</span> button == <span style="color: #ff4500;">1</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> player.<span style="color: black;">GetStatus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == <span style="color: #ff4500;">2</span>:
      player.<span style="color: black;">Play</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
      player.<span style="color: black;">Pause</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #ff4500;">9</span>:
    player.<span style="color: black;">Prev</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #ff4500;">8</span>:
    player.<span style="color: black;">Next</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> scroll<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: black;">direction</span> == gdk.<span style="color: black;">SCROLL_UP</span>:
    player.<span style="color: black;">VolumeSet</span><span style="color: black;">&#40;</span>player.<span style="color: black;">VolumeGet</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> + <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> event.<span style="color: black;">direction</span> == gdk.<span style="color: black;">SCROLL_DOWN</span>:
    player.<span style="color: black;">VolumeSet</span><span style="color: black;">&#40;</span>player.<span style="color: black;">VolumeGet</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> - <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>
&nbsp;
bus = dbus.<span style="color: black;">SessionBus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
player = bus.<span style="color: black;">get_object</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'org.mpris.audacious'</span>, <span style="color: #483d8b;">'/Player'</span><span style="color: black;">&#41;</span>
&nbsp;
window = gtk.<span style="color: black;">Window</span><span style="color: black;">&#40;</span>gtk.<span style="color: black;">WINDOW_TOPLEVEL</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'destroy'</span>, <span style="color: #ff7700;font-weight:bold;">lambda</span> widget, data = <span style="color: #008000;">None</span>: gtk.<span style="color: black;">main_quit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">add_events</span><span style="color: black;">&#40;</span>gdk.<span style="color: black;">BUTTON_PRESS_MASK</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'button-press-event'</span>, button_press<span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'scroll-event'</span>, scroll<span style="color: black;">&#41;</span>
window.<span style="color: black;">set_type_hint</span><span style="color: black;">&#40;</span>gdk.<span style="color: black;">WINDOW_TYPE_HINT_DOCK</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">fullscreen</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
gtk.<span style="color: black;">main</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>完成了！</p>
<p>以后就可以拿我的小本来当音乐播放器+功放啦~</p>
<p>参考资料：</p>
<ul>
<li><a href="http://wiki.xmms2.xmms.se/wiki/MPRIS">MPRIS &#8211; XMMS2</a></li>
<li><a href="http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html">dbus-python tutorial</a></li>
<li><a href="http://www.pygtk.org/pygtk2tutorial/index.html">PyGTK 2.0 Tutorial</a></li>
<li><a href="http://library.gnome.org/devel/pygtk/stable/">PyGTK 2.0 Reference Manual</a></li>
<li><a href="http://www.daa.com.au/pipermail/pygtk/2004-January/006832.html">[pygtk] how to generate scroll wheel mouse event.</a></li>
<li><a href="http://topic.csdn.net/t/20030910/11/2243673.html">如何让窗口置顶？ Linux/Unix社区 / 程序开发区 &#8211; CSDN社区 community.csdn.net</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/a-little-program-for-music-player-control-by-mouse/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

