使用Glade进行PyGTK开发

使用Glade来进行GTK开发效率比较高,下面是一个例子。

将以下代码保存为test.glade文件。

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
45
46
47
48
49
50
51
52
53
54
55
56
  <!--   文件名:test.glade  -->
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.24"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<property name="resizable">False</property>
<property name="default_width">440</property>
<property name="default_height">450</property>
<signal name="destroy" handler="on_MainWindow_destroy" swapped="no"/>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="top_padding">10</property>
<property name="bottom_padding">10</property>
<property name="left_padding">10</property>
<property name="right_padding">10</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">龙昌博客: http://www.xefan.com</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button1">
<property name="label" translatable="yes">关闭</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_MainWindow_destroy" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>

将以下代码保存为test.py文件。

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
#!/usr/bin/env python
# -*- encoding: UTF-8 -*-
##
# @文件名(file): test.py
# @作者(author): 龙昌锦(LongChangjin)
# @博客(blog): http://www.xefan.com
# @邮箱(mail): admin@xefan.com
# @QQ: 346202141
# @ICQ: wosuopu@gmail.com
# @时间(date): 2011-10-25
#
try:
import pygtk
pygtk.require(&quot;2.0&quot;)
except:
pass
try:
import gtk
import gtk.glade
except:
exit(1)

class GBuilder:
def delete_event(self,widget,event,data=None):
return gtk.FALSE
def on_MainWindow_destroy(self,widget,data=None):
gtk.main_quit()
def __init__(self):
#初始化 gtkbuilder
builder = gtk.Builder()
#设置 glade文件
builder.add_from_file(&quot;test.glade&quot;)
#连接 glade文件中的signals
builder.connect_signals(self)

#小部件
self.button1 = builder.get_object(&quot;button1&quot;)
#获取主窗口
self.window = builder.get_object(&quot;window1&quot;)
self.window.show()

if __name__ == &quot;__main__&quot;:
window=GBuilder()
gtk.main()

然后运行查看效果。

用PyGTK创建Dialog对话框

PyGTK创建Dialog的函数如下:
gtk.Dialog(title=None, parent=None, flags=0, buttons=None)

原文地址:http://www.pygtk.org/docs/pygtk/class-gtkdialog.html#constructor-gtkdialog

下面是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python
# -*- coding:UTF-8 -*-
import gtk

label = gtk.Label(u&quot;龙昌博客 http://www.xefan.com&quot;)
dialog = gtk.Dialog(u&quot;测试对话框&quot;,
None,
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
dialog.vbox.pack_start(label)
label.show()
checkbox = gtk.CheckButton(&quot;Useless checkbox&quot;)
dialog.action_area.pack_end(checkbox)
checkbox.show()
response = dialog.run()
dialog.destroy()
if response == gtk.RESPONSE_ACCEPT.real:
print u&quot;确定&quot;
if response == gtk.RESPONSE_REJECT.real:
print u&quot;取消&quot;

Arch Linux安装xfce和slim

这几天终于把Arch Linux + Xfce + slim配置好了,做个笔记备忘。

安装Xfce


https://wiki.archlinux.org/index.php/Xfce_(简体中文)

安装准备

请在安装与使用xfce前确认已经安装有xorg以及hal。

# pacman -S xorg hal

默认安装的archlinux是不包含xorg以及hal的。如果不安装两者,将造成xfce无法启动。HAL 已经被诸如udev,udisks,upower这些程序替代 。

安装XFCE系统(Xfce 4.8)

# pacman -S xfce4 xfce4-goodies
# pacman -S $(pacman -Sgq xfce4-goodies | grep -v xfce4-xfapplet-plugin)

默认安装的xfce4,首次启动出现的小提示窗口里面是没有任何东西的。如果你想看到刚启动时候的技巧和小提示,那么就需要安装fortune-mod

# pacman -S fortune-mod

安装好xfce4之后可能会发现xfce4-mixer通过ALSA并不能控制音量,需要安装gstreamer0.10-base-plugins:

# pacman -S gstreamer0.10-base-plugins

对于笔记本用户,Xfce4-mixer如果不能同时控制外放与耳机,请尝试安装全部Plugins:

# pacman -S gstreamer0.10-plugins

安装和配置Daemons

安装dbus:

# pacman -S dbus

需要在开机的时候自动运行,应该将dbus添加到/etc/rc.conf文件中的DAEMONS:
DAEMONS=(syslog-ng dbus network crond)

如果不想重启开始dbus服务: # /etc/rc.d/dbus start

安装gamin (fam已经是过时的东西),它会在后台自动运行检查文件改动反应给桌面,并且不需要添加到Daemons。

# pacman -S gamin

运行XFCE

手动启动

你只需要运行: $ startxfce4

从终端启动,例如使用xinit/startx 需要配置Xinitrc (简体中文)。
如果还没有~/.xinitrc 文件,系统里有一份实例文件供参考:$ cp /etc/skel/.xinitrc ~/.xinitrc

在最后添加(因为权限的问题推荐在启动xfce之前添加ck-launch-session dbus-launch启):
exec ck-launch-session dbus-launch –exit-with-session startxfce4

在XFCE中关机和重启

在/etc/sudoers文件末尾添加如下一行:
%users ALL=(root) NOPASSWD: /usr/lib/xfce4/session/xfsm-shutdown-helper

# gpasswd -a 你的用户名 users

声音
安装ALSA
https://wiki.archlinux.org/index.php/Advanced_Linux_Sound_Architecture_(简体中文)

要求有本地化的ALSA程序和管理

# pacman -S alsa-lib alsa-utils
# pacman -S alsa-oss

所有ALSA程序都很可能需要依赖alsa-lib。

使用ALSA驱动如何让xfce4-mixer来控制音量

新版的xfce4-mixer使用了gstreamer作为后端,这样就不用直接与驱动交流,更加统一。与驱动打交道的工作交给了gstreamer。因此如果你xfce4-mixer无法正常工作,就需要配置好gstreamer。首先当然你得安装xfce4-mixer。

pacman -S xfce4-mixer gstreamer0.10-base-plugins

你需要至少安装gstreamer0.10-good-plugins,考虑安装gstreamer0.10-bad-plugins

pacman -S gstreamer0.10-good-plugins gstreamer0.10-bad-plugins

然后删除面板上的mixer插件,然后重新添加一次,或者先登出然后再登录一次,对gstreamer做更改后必须这样做才能让操作生效。

安装SLiM


https://wiki.archlinux.org/index.php/SLiM_(简体中文)

介绍

SLiM是Simple Login Manager(简单登录管理器)的缩写。SLiM是简单、轻量级和容易配置的,相对较易在低端和高端的系统中使用。对于那些希望寻找一个不依赖于GNOME或者KDE,可以在Xfce、Openbox、Fluxbox等环境下使用的登录管理器的人来说,SLiM也是非常合适的。

安装

可以在extra软件仓库中找到SLiM: # pacman -S slim

同时还可以安装主题包: # pacman -S slim-themes archlinux-themes-slim

配置

启用SLiM

单用户环境
要将SLiM配置为加载某个特定的环境,只需编辑~/.xinitrc如下:
将[session-command]替换为适当的会话命令。例如:
要启动Xfce:
exec ck-launch-session dbus-launch –exit-with-session startxfce4

打开 /etc/rc.conf。
# vi /etc/rc.conf

添加一个服务slim
DAEMONS=(syslogd klogd !pcmcia network netfs crond slim)

修改默认运行等级

  1. 切换用户到root.
    $ su
  2. 编辑/etc/inittab:
    # vi /etc/inittab
  3. 找到如下这一行:
    id:3:initdefault:
  4. 为了启动X11需要把’3’修改成’5’:
    id:5:initdefault:
  5. 保存此文件并退出编辑器,下次启动时你选择的显示管理器就会运行了。

这样就差不多了,细节上的以后再慢慢琢磨。

Arch Linux安装IBus

安装ibus

# pacman -S ibus
# pacman -S ibus-qt

安装输入法

ibus-pinyin:拼音输入法
ibus-table:一个框架,五笔信赖于它

# pacman -S ibus-{pinyin,table}
# yaourt -S ibus-table-wubi

在~/.bashrc文件中添加如下内容:

export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus

然后执行命令运行ibus: # ibus-daemon

Arch Linux安装

1、首先用Arch Linux的引导盘引导进入live CD。ISO文件下载地址:http://www.archlinux.org/download/

2、以root身份执行脚本: # /arch/setup 然后你就会看到 ArchLinux 安装框架的屏幕。

3、根据自己的情况进行选择
注意在第4项进行磁盘分区时要小心选择,否则操作失误会丢失数据。

安装完后重启即可进入Arch Linux

https://wiki.archlinux.org/index.php/Beginners'_Guide_(简体中文)#.E5.AE.89.E8.A3.85.E5.9F.BA.E6.9C.AC.E7.B3.BB.E7.BB.9F

arm9-2440 linux下烧写

超级终端:使用minicom加ckermit组合,也可以单独使用Gtkterm来代替SecureCRT。
将Port设为设备名,如ttyUSB0。speed改为115200。如图:

ckermit安装好后,进行配置
vi /etc/kermit/kermrc
set line /dev/ttyUSB0
set speed 115200
set carrier-watch off
set handshake none
set flow-control none
robust
set file type bin
set file name lit
set rec pack 1000
set send pack 1000
set window 5

USB下载驱动
dnw_for_linux.tar.gz下载地址: http://115.com/file/aqy4rodm

其中secbulk.c是PC端USB驱动。dnw.c是写入工具,这个是经过我修改的,可以将程序下载到指定的地址。
编译并加载secbulk.c内核模块

$cd secbulk  
$make -C /lib/modules/`uname -r`/build M=`pwd` modules  

编译成功后在当前目录下可以看到secbulk.ko

用insmod命令加载模块,这需要root权限
$sudo insmod ./secbulk.ko

编译dnw写入工具
$cd dnw
$gcc -o dnw dnw.c
编译成功后生成可执行档dnw

使用DNW下载
先使用kermit选择下载模式后再用dnw下载程序。
出现“USB host is connected. Waiting a download.”
Usage: dwn <addr> <filename>
$sudo ./dnw 30000000 led.bin

至此 在linux 下刷机完成
另有usb2ram,使用方法类似。
编译usb2ram需要先安装libusb-dev
Usage: usb2ram addr filename
$sudo usb2ram 30000000 led.bin

Ubuntu 10.10 crosstool ARM交叉编译

弄了两天,经过了N次失败后现在终于编译成功了,赶紧做个笔记。

1、下载crosstool(http://www.kegel.com/crosstool/crosstool-0.43.tar.gz)

2、下载编译过程中需要用到的源代码,虽然crosstool也会自动下载不过速度很慢,建议还是自己先下载好,源代码的版本根据自己的情况选择:
binutils-2.15 http://ftp.gnu.org/gnu/binutils/
gcc-3.4.5 http://ftp.gnu.org/gnu/gcc/
glibc-2.3.6 ftp://ftp.gnu.org/gnu/glibc/
glibc-linuxthreads-2.3.6 ftp://ftp.gnu.org/gnu/glibc/

linux-2.6.10 http://ftp.cc.uoc.gr/mirrors/ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.10.tar.gz
linux-libc-headers-2.6.12.0 http://ep09.pld-linux.org/~mmazur/linux-libc-headers/linux-libc-headers-2.6.12.0.tar.bz2

将以上七个压缩包放在同一个目录下。

3、编译过程依赖这几个软件,没有的请自行安装。Bison、flex 、build-essential、patch 、libncurses5-de
还有gcc的编译依赖于gmp、mpfr、mpc这几个软件,没有的请先安装。
mpc-0.9.tar.gz http://www.multiprecision.org/mpc/download/mpc-0.9.tar.gz
mpfr-3.0.1.tar.bz2 http://www.mpfr.org/mpfr-current/mpfr-3.0.1.tar.bz2
gmp-5.0.2.tar.bz2 ftp://ftp.gmplib.org/pub/gmp-5.0.2/gmp-5.0.2.tar.bz2
这几个软件之间也存在依赖关系,请按顺序依次安装gmp、mpfr、mpc

4、修改配置
1)、ubuntu10.10自己的GCC是4.4版本,使用这个版本的进行编译会出错,建议使用gcc-4.1。
sudo apt-get install gcc-4.1
sudo rm /usr/bin/gcc
sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc

2)、修改sh,ubuntu10.10默认的sh是用的dash
如果运行 ls -la /bin/sh 看到链接是dash,则需要修改一下。不改的话编译会出错。
我是直接运行命令 sudo ln -sf /bin/bash /bin/sh 修改。改完后重启下,或者切换工作台以使其生效。

3)、修改编译脚本
解压crosstool然后进入解压目录,这里我选择demo-arm.sh这个脚本。
cp demo-arm.sh arm.sh

修改arm.sh
vi arm.sh

TARBALLS_DIR=(刚刚下载的源码存放目录)  
RESULT_TOP=(生成工具链要安装到的目录)  
eval `cat arm.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh –notest #这个根据自己的情况选择

然后修改gcc-3.4.5-glibc-2.3.6.dat这个文件
BINUTILS_DIR=binutils-2.15
GCC_DIR=gcc-3.4.5
GLIBC_DIR=glibc-2.3.6
LINUX_DIR=linux-2.6.10
LINUX_SANITIZED_HEADER_DIR=linux-libc-headers-2.6.12.0
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.6

再修改arm.dat这个文件

KERNELCONFIG=`pwd`/arm.config  
TARGET=arm-linux #生成的工具链名称  
TARGET_CFLAGS=”-O”  

还有ubuntu10.10自带的ar、ld是2.20版本的,而这个编译时需要的是2.13~2.19版本的,所以会出错。
解决方法:
(1)、像上面的gcc一样,再安装个低版本的ls、ar。
(2)、如果不想再另外安装就可以用这个方法。修改glibc-2.3.6.tar.bz2这个压缩包内的configure文件。将3920行和3981行处的”2.1[3-9])”改为”2.[1-2][0-9])”。

5、开始编译
都配置好了之后就可以开始了
./arm.sh
漫长的等待开始了……,我的是奔腾双核处理器,整个过程花了半个多小时

6、测试
现在用刚刚编译安装好的arm-linux-gcc来编译一个C程序试试。
先将arm-linux-gcc的安装目录添加到环境变量中。

1
2
3
4
5
//文件名:hello.c
int main()
{
printf(&quot;www.xefam.com&quot;);
}

$ arm-linux-gcc -o hello hello.c
$ file hello
hello: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), for GNU/Linux 2.4.3, not stripped
这就说明这个已经成功了!

7、现在可以恢复之前的系统配置了
将gcc修为gcc-4.4
将sh修改dash

如果嫌麻烦不想自己编译的可以直接下载已经编译好的来用,下面这个就是我编译好:
gcc-3.4.5-glibc-2.3.6.tar.gz http://115.com/file/e65akpi1

I2C串口总线驱动程序(汇编语言)

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
;I2C串口总线驱动程序
;作者:龙昌
;博客:http://www.xefan.com
;请根据自己的实际情况定义SCL和SDA

;延时4.7us以上,我的是12MHz的晶振,请根据自己的晶振频率相应增删NOP条数
_NOP: NOP
NOP
NOP
NOP
NOP
RET

;发送开始信号
I2CB: SETB SDA
NOP
SETB SCL
ACALL _NOP
CLR SDA
ACALL _NOP
CLR SCL
RET

;发送结束信号
I2CE: CLR SDA
NOP
SETB SCL
ACALL _NOP
SETB SDA
ACALL _NOP
CLR SCL
RET

;发送应答(ACK)
MACK: CLR SDA
NOP
SETB SCL
ACALL _NOP
CLR SCL
RET

;发送非应答(/ACK)
MNACK: SETB SDA
NOP
SETB SCL
ACALL _NOP
CLR SCL
RET

;发送一个字节数据,要发送的数据存放在A寄存器中
SendB: MOV R5,#8
SendB1: RLC A
MOV SDA,C
NOP
SETB SCL
ACALL _NOP
CLR SCL
DJNZ R5,SendB1
;接收ACK
SETB SDA
NOP
SETB SCL
NOP
NOP
MOV C,SDA
MOV ACK,C
CLR SCL
RET

;接收一个字节的数据,接收完后存放在A寄存器中
RecvB: MOV R5,#8
RecvB1: SETB SDA
NOP
SETB SCL
NOP
NOP
MOV C,SDA
RLC A
CLR SCL
DJNZ R5,RecvB1
RET

I2C协议说明

IIC(Inter - Integrated Circuit)总线是菲利浦公司推出的芯片间串行传输总线。它用两根线实现了完善的全双工同步数据传送。

I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。

I2C总线在传送数据过程中共有三种类型信号,它们分别是:

开始信号、结束信号和应答信号。

开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

应答信号:数据接收完后,受控单元向主控单元发送一个应答信号。

开始信号是必需的,结束信号和应答信号可以不要。

数据传输格式如下:

主控写: 开始| 寻址字节(写)| 应答| 数据| 应答| …| 数据| 应答| 结束

主控读: 开始| 寻址字节(读)| 应答| 数据| 应答| …| 数据| 非应答| 结束

下划线部分表示主控发送,被控接收;其余为主控接收,被控发送。

时钟脉冲如图所示:

Pygame学习笔记11:手柄

手柄

joystick模块管理计算机上的手柄设备(可能多于一个)。手柄设备包括轨迹球、类似电视游戏机的游戏手柄,允许使用多个按钮和’hats’。

pygame.joystick.get_count函数可以获得系统中手柄的个数。比如:

count = pygame.joystick.get_count()

如果系统没有手柄,数量是0。

如果系统有手柄,可以通过pygame.joystick.Joystick来创建手柄对象:

j = pygame.joystick.Joystick(0)

其中的整数是手柄的id,取值范围从0到count-1。

创建对象后,需要先初始化

j.init()

初始化后,事件队列中就可以收到来自手柄的事件了。事件类型分为:

JOYAXISMOTION joy, axis, value
JOYBALLMOTION joy, ball, rel
JOYHATMOTION joy, hat, value
JOYBUTTONUP joy, button
JOYBUTTONDOWN joy, button

要注意pygame.JOYAXISMOTION事件的value值在-1.0和1.0之间。值0.0表示轴在正中间。游戏手柄设备一般只有-1、0、1三个值,而没有中间的值。而老的模拟手柄并不一定能完全达到-1到1的区间,中间的值也可能是0附近的一个值。模拟手柄通常会有一点噪声,从而会产生很多很小很快的运动事件。当轨迹球滚动时,pygame.JOYBALLMOTION事件会发生。它会报告轨迹球总共滚动了多少距离。当按钮被按下和释放时,会产生pygame.JOYBUTTONDOWN和pygame.JOYBUTTONUP事件。当hat的位置改变时,pygame.JOYHATMOTION事件会产生。事件的位置属性包括一对值,它们是-1或者0或者1。位置(0,0)表示hat在正中间。

要获得手柄的轴数可以使用

j.get_numaxes()

要获得手柄上轨迹球的个数,可以使用

j.get_numballs()

要获得手柄上的按键数,可以使用

j.get_numbuttons()

要获得手柄上hat控制器的个数,可以使用

j.get_numhats()

除了通过事件获得手柄的输入外,也可以直接查询手柄的状态。通过

j.get_axis(axis_number)

可以获得某个轴的位置。通过

j.get_ball(ball_number)

可以获得某个轨迹球的相对位置。通过

j.get_button(button)

可以获得某个按键的状态。通过

j.get_hat(hat_number)

可以获得hat控制器的当前位置。