PyGObject 学习笔记(10)-GMenu & GSimpleAction

Published on:

有段时间没更新了,一直想着想重新改一下Bolg,所以没怎么写了。好~二话不说,现在继续。今天来讲一个新的控件,一看标题,对!又是菜单,但这次菜单和之前的《PyGtk学习笔记(6)–菜单》的菜单是不同,自从转向学习PyGObject了,会有很多GTK 3的特性,所以,这次的 GMenu 和以往的菜单不同。所以老规矩,看图吧。

上面的图就是 GMenu 在原生 Gnome3 桌面里面显示的效果。好了,开始介绍。

一. 介绍

Ubuntu 的 Unity 桌面使用了全局菜单,为应用程序增加了很多可视空间。当然,在 Gnome3 里面同样可以省去传统的 MenuBar ,根据 Gnome3 的新特性,增加了 GMenu 。就像上面的图一样,将菜单功能集成在 Gnome 的任务栏中,同样为用户挤出了更多的空间,而且现在很多 Gnome3 的应用也开始使用这一特性了,如:Empathy。当然,刚开始很多童鞋找不到菜单在最顶上,呵呵,不过发现了以后还是会比较惊喜,这样会省出一个 Bar 的空间。

1.类结构

1
2
3
GObject
    ----GMenuModel
          ----GMenu

要注意的是,GMenu 是在 GIO 中,而不是在 GTK 中,所以应该导入 Gio 模块

Read on →

Linux 下的 Chrome 中 Flash 中文显示方框解决办法

Published on:

先强烈吐嘈一下:以后大家尽量用 Html5 来淘汰 Adobe Flash 吧,一直以来各种系统漏洞很多情况都是来自 Flash ,而且 Flash 也有着各种局限性,虽然现在 Html5 还不成熟,但它正走向成熟。尤其在 Linux 桌面系统中,Flash 也不进行更新了(只进行安全更新),同时“号称”跨平台的 Adobe AIR 也不开发 Linux 版本了。我们只能用旧的…

对于 Linux 用户来说,Adobe 已经不更新 Flash 了,最后一个版本是 11.2 。除非你使用 Google 的 Chrome 浏览器,Chrome 中内置了最新版本的 Flash ,最新版本是 11.5 。也就是说以后有人想在 Linux 下用最新的 Flash 那么就只能用 Chrome 了,不过我觉得这没必要, Flash 迟早也是会淘汰的,只是时间问题,就和 IE6 一样。但现在在国内的网络状况中,你真的不能不没有 Flash ~ 汗~~ 比如在线看个视频、听个音乐、等等,都需要 Flash 的支持。

而对于 Linux 下的 Flash 来说,貌似它对本地中文字库支持的不够好,或者换句话说,目前很多 Linux 发行版中的中文字库不够全。这样以来有一些包含 Flash 的网站,中文字只能变身成为 “口口口”了!

好了,前面说了一些废话,但这些都是一直我想说的。。。下面是正题:

问题来源:

之前我都是主用 Firefox ,我的系统是已经安装了 Flash 的,即 11.2 版本。而且因为我用的是 Ubuntu ,系统中已经包含文泉驿、方正等中文字体。所以在 Firefox 中使用 Flash 是可以正常显示中文字的。今天,我安装了 Chrome ,接着刚好在 Chrome 中打开了 三国杀Online ,接着就开杀啦。。呵呵,玩着正欢的时候突然发现聊天的框中,中文字全变成“口口口”了,如图:

看到上面的图你什么感觉?唉~可能别人骂你你都不知道呢~

问题原因:

出现这样的情况,无非就是 Flash 找不到对应的字体,可能是你系统中没有安装这种字体,或者就是你安装了这种字体,Flash 没办法调用它。Linux 相关字体的配置,在这个地方 /etc/fonts/conf.d ,但是不建议修改,因为现在的情况不是配置的原因使得出现“口口口”的。因为此时,我的 Firefox 中能够正常显示 Flash 中的中文字,而 Chrome 中不能正常显示。到这里,原因很简单了,是 Chrome 中内置的 Flash 的问题。PS:我在网上搜索,有人说是 Chrome 内置的 Flash 没有修改字体的接口。

解决办法:

其实问题就是这样,知道原因了就好解决了。是 Chrome 内置 Flash 出现的问题,那么我们就不用它内置的就行咯~我们系统中本身自己就安装好了 11.2 版本的 Flash ,那么我们只要使 Chrome 能够调用系统中安装的 Flash 就行了。

步骤如下:

1.打开 Chrome ,在地址栏输入  进入插件页面,把详细信息展开 。

2.找到 Adobe Flash Player  (2 files),你此时会看到后面有个 (2 files),这就对了,一个是内置的,一个是系统里安装的。从两个文件的路径也能看出来,一个是: /opt/google/chrome/PepperFlash/libpepflashplayer.so  ,即 Chrome 内置的;还一个是: /usr/lib/flashplugin-installer/libflashplayer.so  ,即我们系统里安装的。

3.Chrome 里在有两个 Flash 的时候是优先使用内置的,所以这里只要 停用 内置的 Flash 就可以了~

停用后你在打开 Flash 就能看到正常的中文字了,点击鼠标右键,你也会发现不是之前的 11.5 版本了,而是系统的 11.2 版本了~

OK~问题解决,留下此文~

 

 

 

PyGObject 学习笔记(9)-标签

Published on:

Label (标签)可以说是任何应用中最常见的控件了,使用标签是在窗口中显示不可编辑的文字的最常用方法。简单讲就是用来显示信息的。我们从最简单的 Hello World 例子看一下,如图:

就像上面的图一样,就是显示一个简单的信息,完整代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Label Example
# PyGObject Study Notes By DawnDIY
# http://dawndiy.com

from gi.repository import Gtk

class LabelWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Label Example")

        label = Gtk.Label("Hello World!")

        self.add(label)

win = LabelWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

是不是很简单,但是,不是仅仅如此哦。其实 Label 也有挺多显示方法的,如果选择合适的显示,会给你的窗口添加不少亮点,下面我们就详细看一下。

先从 Label 对象看起:

class Gtk.Label([text ])

在新建一个 Label 时,可以直接附上 text 的内容即可,如果没有值即空。

常用方法:

static new_with_mnemonic(text)

这是一个静态方法,返回的也是一个Label。但是有所不同的是,这个方法可以设置类似快捷键的事件,通过下划线(_)来指定快捷键字母,当然这个方法要配合 set_mnemonic_widget(widget) 来使用,通过键盘上按下 Alt [指定字母] 来激活 set_mnemonic_widget(widget) 绑定的控件的事件。详情看后面例子。

set_mnemonic_widget(widget)

设置前面指定快捷键激活的控件事件。如果为空或者没有使用该方法,则默认为 Label 本身。

set_justify(justification)

使用这个方法设置文字的对齐方式。

justification

可以是:Gtk.Justification.LEFT, Gtk.Justification.RIGHT, Gtk.Justification.CENTER,
Gtk.Justification.FILL. 分别是左对齐,右对齐,居中和填充。不过这个方法对尽有一行文字的Label是无效的。

set_line_wrap(wrap)

这个是控制内容换行的。当 wrap 的值为 True ,如果一行内容超过了 Label 控件的大小,那么将内容换行显示。当 wrap 的值为 False ,如果一行内容超过了 Label 控件的大小,内容将被剪切掉。

set_markup(markup)

这个是好东西,可以让你的 Label 显示更加丰富,通过该方法让 Label 的内容支持标记输出,其中的标记必须符合 Pango 的文本标记语言,如, & 字符都要用 < > &amp 来替换。下面的完整例子中会用到。

set_selectable(selectable)

这个方法设置文本内容是否可选择,selectable 默认是 False,即不可选,为 Ture 时则可以供用户选择用户复制粘贴。

set_text(text)

这个就不用多说了,看它就知道是干嘛的啦,使用它可以随时更改 Label 的内容。

好的,我们现在汇总一下看一个比较长的例子,上图先,呵呵:

这个例子包含了上面我讲到的常用方法,和一些 Label 的用法,看看完整的源代码和 Label 的内容你就懂啦~

完整代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Label Example
# PyGObject Study Notes By DawnDIY
# http://dawndiy.com

from gi.repository import Gtk

class LabelWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Label Example")
        hbox = Gtk.Box(spacing=10)
        hbox.set_homogeneous(False)
        vbox_left = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
        vbox_left.set_homogeneous(False)
        vbox_right = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
        vbox_right.set_homogeneous(False)
        hbox.pack_start(vbox_left, True, True, 0)
        hbox.pack_start(vbox_right, True, True, 0)
        label = Gtk.Label("这是一个普通 label")
        vbox_left.pack_start(label, True, True, 0)
        label = Gtk.Label()
        label.set_text("这是一个左对齐的 label。n包含多行。")
        label.set_justify(Gtk.Justification.LEFT)
        vbox_left.pack_start(label, True, True, 0)
        label = Gtk.Label("这是一个右对齐的 label。n包含多行。")
        label.set_justify(Gtk.Justification.RIGHT)
        vbox_left.pack_start(label, True, True, 0)
        label = Gtk.Label("这是一个多行显示的 label 示例。它"
                            "不是占据所有能容纳下它的"
                            "宽度,而是自动的换行调整适应。n"
                            "并且它支持多段落正确的显示,"
                            "正确的补充额外的空间。")
        label.set_line_wrap(True)
        vbox_right.pack_start(label, True, True, 0)
        label = Gtk.Label("这是一个多行显示的 label 示例,填充式 label 。"
                            "它会占据所有能容纳下它的宽度。 "
                            "好,来几个句子证明我的说法。"
                            "这又是一个句子。又来一个句子,巴拉巴拉巴拉。n"
                            "这是一个新段落~n"
                            "好吧,这又是一个扯淡的段落,扯点"
                            "什么呢?元芳,你怎么看啊?呵呵~")
        label.set_line_wrap(True)
        label.set_justify(Gtk.Justification.FILL)
        vbox_right.pack_start(label, True, True, 0)
        label = Gtk.Label()
        label.set_markup("文本内容可以 小, 大, "
                            "粗体, 斜体 甚至可以是超链接 "
                            " 网络.")
        label.set_line_wrap(True)
        vbox_left.pack_start(label, True, True, 0)
        label = Gtk.Label.new_with_mnemonic("按下 Alt   P 来选择右边的按钮 (_P)")
        vbox_left.pack_start(label, True, True, 0)
        label.set_selectable(True)
        button = Gtk.Button(label="点一下试一试")
        label.set_mnemonic_widget(button)
        vbox_right.pack_start(button, True, True, 0)
        self.add(hbox)

window = LabelWindow()
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()

好啦~ Label 挺简单的。。。 用好 mark 会表现的更出色的。 See you next time~

现在开始,之前的代码都传到 github 上去了。
文中的例子在这里:  

 

 

 

 

 

 

 

 

 

 

 

Linux 下使用 Fastboot 给手机刷机

Published on:
Tags: Android, Linux

近期一直都没电脑用,一直在用手机。今天看看手机的东西好杂好乱,想好好理理啦,所以准备刷下机。之前都是下好卡刷包然后卡刷的,想到之前我在电脑上配好了 Android 的开发环境,可以尝试一下在 Ubuntu 下线刷。应该很多人都是在 Windows 下线刷的吧,其实在 Linux 下一样非常简单,尤其是现在一些包还写好了脚本。

在 Linux 下首先应该准备一下环境,也就是 Android 开发调试环境。可以参考我之前的文章:《Ubuntu 下搭建 Android 开发环境(图文)》 这里其实你只是想刷机的话,看完前4点就行了。老早就配置好了环境的朋友就跳过咯~

接下来我们准备好你手机的线刷包,注意里面一定是解压后包含 images 文件夹的包,其余的就是一些脚本。

剩下的就是我们开始连接手机咯。注意:要确定你的手机 设置 > 开发人员选项 > USB 调试 勾选上了。好的,接下来使用USB数据线连接你的手机到电脑。运行下面代码:

lsusb

这时候你会看到下面类似的结果:

Bus 001 Device 002: ID 064e:a111 Suyin Corp. 
Bus 001 Device 003: ID 0bda:8189 Realtek Semiconductor Corp. RTL8187B Wireless 802.11g 54Mbps Network Adapter
Bus 002 Device 003: ID 18d1:9025 Google Inc. 
Bus 005 Device 002: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

其中 Google Inc 这一行现实的是我的设备。你可以更具自己的手机厂商来判断那个是你的设备,在这里我们需要记录下的是 ID  18d1:9025 这一串。接下来运行下面代码:

sudo gedit /etc/udev/rules.d/android.rules

在文件中添加如下信息:

SUBSYSTEMS=="usb", ATTRS{idVendor}="18d1", ATTRS{idProduct}="9025", MODE="0666"

注意上面的数字和前面我们获得的那一串的对应,而最后的 MODE 是不变的。好的,修改保存好以后,给这个文件添加读和执行权限:

sudo chmod  rx /etc/udev/rules.d/android.rules

接着我们就能够连接手机了,运行下来代码:

sudo adb devices

然后我们会看到如下信息,成功连接手机的话会显示 device 信息:

* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached 
bc762e7c    device

如果你显示 ????? 或者 没权限,可能是前面的步骤没做好,或是环境变量没有配好。而且,这里 adb 记得用 root 权限来运行,即 sudo。

好了,连接了,我们可以试一试,如果你动 shell 的话,你可以运行 sudo adb shell ,这样就直接在电脑上运行你 Android 手机上的 shell 命令了。

好了,回到正题,我们是要刷机,而且是线刷。首先线刷不是在开机状态下执行的,所以运行下面代码使得你的手机进入 fastboot 模式 准备开始线刷:

sudo adb reboot-bootloader

稍等片刻手机就会重启至 Fastboot 模式,等待刷机的开始。如果你早就知道怎么进入你手机的 Fastboot 模式,你也可以省去上面的步骤直接进入 Fastboot 模式,进行下面的步骤:

sudo fastboot devices

如果能够现实如下信息,表示你的电脑此时能够连接到手机的 Fastboot 模式。

bc762e7c fastboot

这时候要通过 cd 命令来到你的线刷包的目录,一般线刷包里面会有 fash_all.sh这个刷机脚本,这是我们可能需要修改一下它的可执行权限:

sudo chmod  x flash_all.sh

修改好权限以后,我们执行它就行了:

sudo ./flash_all.sh

接下来我们看到的就是正在刷机了,等几分钟就OK了~下面是我的刷机显示时长:

sending 'tz' (102 KB)...
OKAY [ 0.010s]
writing 'tz'...
OKAY [ 0.209s]
finished. total time: 0.219s
sending 'sbl2' (106 KB)...
OKAY [ 0.009s]
writing 'sbl2'...
OKAY [ 0.226s]
finished. total time: 0.235s
sending 'rpm' (112 KB)...
OKAY [ 0.011s]
writing 'rpm'...
OKAY [ 0.238s]
finished. total time: 0.248s
sending 'sbl3' (596 KB)...
OKAY [ 0.046s]
writing 'sbl3'...
OKAY [ 0.227s]
finished. total time: 0.274s
sending 'sbl1' (82 KB)...
OKAY [ 0.009s]
writing 'sbl1'...
OKAY [ 0.050s]
finished. total time: 0.059s
sending 'aboot' (575 KB)...
OKAY [ 0.044s]
writing 'aboot'...
OKAY [ 0.401s]
finished. total time: 0.445s
erasing 'boot'...
OKAY [ 0.009s]
finished. total time: 0.009s
sending 'misc' (8 KB)...
OKAY [ 0.003s]
writing 'misc'...
OKAY [ 0.008s]
finished. total time: 0.011s
sending 'modem' (28780 KB)...
OKAY [ 2.160s]
writing 'modem'...
OKAY [ 6.352s]
finished. total time: 8.513s
sending 'cache' (1024 KB)...
OKAY [ 0.083s]
writing 'cache'...
OKAY [ 0.352s]
finished. total time: 0.435s
sending 'system' (219136 KB)...
OKAY [ 16.157s]
writing 'system'...
OKAY [ 35.635s]
finished. total time: 51.793s
sending 'system1' (219136 KB)...
OKAY [ 15.927s]
writing 'system1'...
OKAY [ 35.692s]
finished. total time: 51.619s
sending 'recovery' (5592 KB)...
OKAY [ 0.405s]
writing 'recovery'...
OKAY [ 0.785s]
finished. total time: 1.190s
sending 'userdata' (204800 KB)...
OKAY [ 14.776s]
writing 'userdata'...
OKAY [ 31.363s]
finished. total time: 46.139s
sending 'boot1' (4430 KB)...
OKAY [ 0.328s]
writing 'boot1'...
OKAY [ 0.733s]
finished. total time: 1.061s
sending 'boot' (4430 KB)...
OKAY [ 0.320s]
writing 'boot'...
OKAY [ 1.028s]
finished. total time: 1.349s

OK,最后用下面代码重启一下手机你就能看到系统刷机成功了~ ^.^

sudo fastboot reboot

附上我刷机的脚本:

fastboot flash tz images/tz.mbn
fastboot flash sbl2 images/sbl2.mbn
fastboot flash rpm images/rpm.mbn
fastboot flash sbl3 images/sbl3.mbn
fastboot flash sbl1 images/sbl1.mbn
fastboot flash aboot images/emmc_appsboot.mbn
fastboot erase boot
fastboot flash misc images/misc.img
fastboot flash modem images/NON-HLOS.bin
fastboot flash cache images/cache.img.ext4
fastboot flash system images/system.img.ext4
fastboot flash system1 images/system.img.ext4
fastboot flash recovery images/recovery.img
fastboot flash userdata images/userdata.img.ext4
fastboot flash boot1 images/boot.img
fastboot flash boot images/boot.img

不过一般线刷包里面都会有脚本的,呵呵~ 也祝你刷机成功!!!

over….

 

 

PyGObject 学习笔记(8)-消息对话框

Published on:

写在前面,先扯点无聊的。这几天回家才有时间用电脑,刚好昨天升级了一下 Ubuntu 12.10 。然后当然也要更新一下学习笔记,学习在于坚持嘛~ 可能发现标题不同了,不错,我在前几天谈到我的学习心得和经历让我做出了选择,一定要向前,用GTK 3 所以选择PyGObject。可以看我写的《PyGtk or PyGObject》,也扯了一些有的没的。

好了,正题开始,今天在一点点的码自己的项目的时候要用到一个很重要的东西,那就是“消息对话框”,即 Message Dialog 。这个是什么了,如果你不知道那就快回火星吧!上图!

对,就是上面这个图,你见过吧。消息对话框在程序中随处可见,他的作用就是提示或弹出一个信息让用户得知,所以消息对话框在交互方面和用户体验方面也是挺重要的。

在GTK 3中,构建消息对话框的类是MessageDialog。下面来看一下这个类:

class Gtk.MessageDialog(parent=None, flags=0, type=Gtk.MESSAGE_INFO, buttons=Gtk.BUTTONS_NONE, message_format=None)

parent :

父控件,一般是窗体

flags :

对话框标识,可以是 Gtk.DialogFlags.MODAL,Gtk.DIALOG_DESTROY_WITH_PARENT 或 0

type :

消息的类型,可以是 Gtk.MESSAGE_INFO, Gtk.MESSAGE_WARNING, Gtk.MESSAGE_QUESTIONGtk.MESSAGE_ERROR.

buttons :

可以使用预定义的按钮: Gtk.BUTTONS_NONE, Gtk.BUTTONS_OK, Gtk.BUTTONS_CLOSE, Gtk.BUTTONS_CANCEL, Gtk.BUTTONS_YES_NO, Gtk.BUTTONS_OK_CANCEL 等

message_format :

消息的内容

Returns :

 G``tk.MessageDialog

上面就是构造消息对话框的 MessageDialog 类啦。

现在看一下我们最上面那个图的代码是怎么样的:

dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO,Gtk.ButtonsType.OK, "这是一个信息消息对话框")
dialog.format_secondary_text("这里是副文本用于说明信息。")
dialog.run()
dialog.destroy()

这是一个消息对话框的部分代码。是不是很简单,然而上面多了几个函数下面解释:

dialog.format_secondary_text("这里是副文本用于说明信息。")

这个看图也知道啊,就是现实在下面的副文本,可以用来显示解释性文字。

dialog.run()
dialog.destroy()

run执行后,对话框就会显示了,这时候对话框不会马上去执行后面的destroy来销毁,而是等待我们的一个按键响应再来销毁,所以这就是消息对话框有按钮的原因了。

上面的例子我们没有或得到按键响应,其实我们的按键响应就是由 dialog.run() 来返回的,所以中断在它这里嘛~那我们再看一个能获取按键的例子,惯例,上图先:

看吧,这样的消息对话框就有两个按钮分别让你选择。看下局部代码:

dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, "这是一个询问消息对话框")
dialog.format_secondary_text("这里是副文本用于说明信息。")
response = dialog.run()
if response == Gtk.ResponseType.YES:
    print("YES button is clicked")
elif response == Gtk.ResponseType.NO:
    print("NO button is clicked")
dialog.destroy()

看到代码中我们定义了一个名为 response 的变量来接受 dialog.run() 的返回,然后再做出判断分别处理就OK啦。。。

好了,差不多就这些吧~大家可以试一试,我把写好的一个完整的 Demo 贴出来:

#!/usr/bin/env python
# -*- coding: utf-8 -*
# MessageDialog
# PyGtk Study Notes By DawnDIY
# http://www.dawndiy.com 

from gi.repository import Gtk

class MessageDialogWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="MessageDialog Example")

        box = Gtk.Box(spacing=6)
        self.add(box)

        button1 = Gtk.Button("信息")
        button1.connect("clicked", self.on_info_clicked)
        box.add(button1)

        button2 = Gtk.Button("错误")
        button2.connect("clicked", self.on_error_clicked)
        box.add(button2)

        button3 = Gtk.Button("警告")
        button3.connect("clicked", self.on_warn_clicked)
        box.add(button3)

        button4 = Gtk.Button("询问")
        button4.connect("clicked", self.on_question_clicked)
        box.add(button4)

    def on_info_clicked(self, widget):
        dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO,
        Gtk.ButtonsType.OK, "这是一个信息消息对话框")
        dialog.format_secondary_text(
        "这里是副文本用于说明信息。")
        dialog.run()
        print "INFO dialog closed"

        dialog.destroy()

    def on_error_clicked(self, widget):
        dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.ERROR,
        Gtk.ButtonsType.CANCEL, "这是一个错误消息对话框")
        dialog.format_secondary_text("这里是副文本用于说明信息。")
        dialog.run()
        print "ERROR dialog closed"

        dialog.destroy()

    def on_warn_clicked(self, widget):
        dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.WARNING,
        Gtk.ButtonsType.OK_CANCEL, "这是一个警告消息对话框")
        dialog.format_secondary_text(
        "这里是副文本用于说明信息。")
        response = dialog.run()
        if response == Gtk.ResponseType.OK:
            print "OK button is clicked"
        elif response == Gtk.ResponseType.CANCEL:
            print "CANCEL button is clicked"

        dialog.destroy()

    def on_question_clicked(self, widget):
        dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION,
        Gtk.ButtonsType.YES_NO, "这是一个询问消息对话框")
        dialog.format_secondary_text(
        "这里是副文本用于说明信息。")
        response = dialog.run()
        if response == Gtk.ResponseType.YES:
            print "YES button is clicked"
        elif response == Gtk.ResponseType.NO:
            print "NO button is clicked"

        dialog.destroy()

win = MessageDialogWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

效果自己去运行就知道了OK~最近好忙啊,好不容易偷个懒上下网下回继续…….

 

 

 

 

PyGTK or PyGObject

Published on:

本来是写应该开始用PyGObject来代替PyGTK的,结果扯了很多自己的经历,呵呵,我的博客不能只有技术文章啊,也要点扯淡的东西!
——————————–

最初是在Linux的GNOME桌面下认识了GTK ,后来为了能在Linux桌面下开发桌面应用就一直在学习GTK ,起初我只会C/C 和Java。经过一番查阅对于GTK 的开发还是C的文献比较多,那就看吧、学吧。。。后来看的没心思啦,可能本来我C/C 用的就比较少,好多库不熟悉,后来就没看了。想在Linux桌面开发的愿望也就搁置在一旁啦。

但是后来我发现了 Java-Gnome ,也就是GTK 的Java绑定版本,不过一样中文文献资料非常少,那就英文的吧,又不是啃啃看不懂。刚好那时候Java天天在手上用,非常习惯,在加上之前看过的GTK 的一些教程文章,我又燃起了当初开发桌面应用的热情,刚好那时候还自己学了一项新技术,就是面向对象的数据库–db4o,然后一起结合起来完成了我的第一个正式的Linux的桌面应用。

在Linux下开发当然想做跨平台嘛,不过悲剧来了,我这才发现使用 Java-Gnome 开发的程序不能直接在 Windows 平台上使用。后来的后来越来越发现 Java-Gnome 的一些缺点。首先开源软件的通病–更新缓慢,官方现在 Java-Gnome 的最新版本是 4.1.2 。而且按照官方的说法要到 4.2 才算正式版。而且现在已经 GTK 3 了,Java-Gnome 还只是支持GTK 2 。我也一直没有看到有什么要更新的动静。所以我之前还在抱怨我用Glade3做的UI文件用Java-Gnome解析不了,非要用Glade2来做UI才能用。这一点也证实了 Java-Gnome不支持GTK 3 。所以我的桌面应用又搁浅啦~

在大二的时候,老师出了一道有意思的ACM题目给我们做,当时记得我用C 写了几十行的代码才解决,结果老师介绍有一个叫Python的语言,5行搞定,我当时眼前就一亮,马上去找资料学习,发现 Python 真是方便,而且是解释型的语言,调试起来非常方便。对于我来说更重要的是学习这类语言让我想起来我学的第一门编程语言–QBasic。所以Python让我找到了当时最初学习编程的热情,后来就怀抱着这个热情学习Python到现在。

当然,Python让我相见恨晚,非常喜欢这种风格和简洁的语言,后来同样学习了 PyGTK 。所以有了我的PyGTK学习笔记,我想认真学习一下,然后重写我那一波三折的项目,等到成熟了我就会正是发布。学习嘛,我当然是看官网资料咯,但是刚开始去了解 PyGTK的时候我也注意到了 PyGObject ,但是我当时没有放在心上,因为目前 PyGTK 的资料还是挺多的,所以让我忽视了 PyGObject 但是不断学习,就会不断发现。现在正的了解到确实向PyGObject会成为未来的替代品,官方就是这么说的,而且目前的PyGTK是只支持GTK 2的,想要用 Python 来写 GTK 3的应用应该用 PyGObject ,而且在 Gnome 上翻译的时候也发现所有的代码都是用”from gi.repository import Gtk”,而不是以前的”import gtk”了,看到这里我自己想想应该向前看看嘛~所以呢,以后,当然我的 学习笔记 会继续随笔写一写,以后的都会围绕 PyGObject 来写。而且看到 Fedora 早就说要在最新发行版里面默认Python3了,不仅如此,Ubuntu 也宣布在最新的发行版里会默认安装Python3 。 这样更说明我要多多向前看啊。所以以后的学习Python/PyGTK/PyGObject的笔记都会用python3 。

在这里先写一个简单的使用Python开发GTK 3的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/python
from gi.repository import Gtk

class MyWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Hello World")

        self.button = Gtk.Button(label="Click Here")
        self.button.connect("clicked", self.on_button_clicked)
        self.add(self.button)

    def on_button_clicked(self, widget):
        print "Hello World"

win = MyWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

图片这次不上了,因为自己试过一遍才是最好的体会!!!!

More: https://python-gtk-3-tutorial.readthedocs.org/en/latest/index.html (English)

因为这段时间一直准备那个什么***|考试,每天也只能睡觉前看看自己感兴趣的东西,而且偷个懒上个网更新一下博客~呵呵~

PS:本来就是要说一下以后用PyGObject和Python3的,结果扯了这么一大堆!!! over~

 

Firefox 浏览器中体验 Firefox OS (多图)

Published on:
Tags: Firefox

Firefox OS (原名 Boot to Gecko,即B2G)是 Mozilla 公司以Gecko浏览器引擎为核心,采用HTML5来开发的一款移动操作系统。目前该项目还在开发完善中,但是网上已经有很多和它相关的视频、图片、ROM等等资源啦,继 Android 之后又一款重量级的移动操作系统即将诞生。

Firefox OS 的消息不断,如此神秘当然勾起了不少朋友的好奇之心,但是目前开发阶段,能支持 Firefox OS 的设备非常少,不是每个人都能体验。但如今这个问题得到解决啦,Firefox OS 本来就是采用 HTML5 开发的,当然能运行在支持 HTML5 的设备上啦,如我们使用的 Firefox 浏览器。对,现在 Mozilla 提供了一个插件,无需编译、模拟等工具,直接安装 Firefox 浏览器的插件r2d2b2g即可完美运行 Firefox OS。

插件地址(使用 Firefox 浏览器点击即可安装):

原地址: http://people.mozilla.com/~myk/r2d2b2g/           (请根据不同的操作系统选择)
插件大小有 52.4M。

安装好后会出现如下提示:

按照提示,我们找到 工具>B2G Desktop 即可启动 Firefox OS ,如下图。(如果你的浏览器隐藏了菜单栏,显示菜单栏就可以看到工具选项了)

右边是 Firefox OS 的界面,可以通过鼠标来模拟触屏操作,Home 键返回主页,ESC 返回。 左边是控制台信息。

下面你就可以在浏览器里面体验 Firefox OS 啦~

注意:目前该插件也是开发测试用,所以在你尝试的时候会非常不稳定或者一些功能不可用,毕竟就算体验一下吧。希望 Firefox OS 正式与大家见面的时候能够更加出色!该插件也是开源的,想了解该插件的详细信息可以看这里: https://github.com/mozilla/r2d2b2g

下面附上一些 Firefox OS 的图片:

 

GNOME 3.6 发布!

Published on:
Tags: Linux

GNOME 3.6

GNOME 项目自豪地推出了 3.x 系列的第三次更新–GNOME 3.6。最新版本的 GNOME 3 包含了许多新特性和增进,如大量的 bug 修复和部分改善。同时,也给 GNOME 3 的用户体验带来了重大升级。

GNOME基金会的总裁 Andreas Nilsson 说道:“GNOME 基金会很自豪的推出这次最新版的GNOME,而且我要祝贺 GNOME 社区的成就。” 他描述这次发布:“这是我们以把自由和开放的计算环境带给每一个人为我们任务的一次重要的里程碑。”

这次发布的重要特性包括:

  • 通知系统的重大改进,包括消息托盘的重新设计,更智能的通知,以及其他优化。
  • 对“活动概览”进行了增强,着重改进了布局。
  • 增强“文件”应用,增强文件搜索功能,新的最近位置,重新设计界面以及修复大量 bug 和其他新特性。
  • 整合 Input Sources ,使得输入不同的字符集(如中文)简单而快速。
  • 辅助功能的需求,如 Orca 屏幕阅读器能通过按下按钮开启。
  • 新的锁定屏幕。在设备锁定时提供了一个有吸引力的视图,加上像媒体控制和通知等方便的功能。

[![][3]][3] [![][4]][4]

GNOME 3.6 还包括很多增强,其中包括在线帐号支持Microsoft Exchange, Facebook 和 Windows Live,大量的系统设置和重新设计的用户菜单。许多 GNOME 应用也得到了改善,包括 Web,Empathy,磁盘使用分析,磁盘和字体查看器。这个版本也包含了第一个主要版本的 Boxes,这是一个使用远程系统和虚拟机的应用程序,还有开发预览的新时钟应用。

你可以在发行说明中阅读到包括 GNOME 3.6 在内的所有变化。这个最新版是 GNOME 社区,一个开放、个人和组织的国际联合的社区,耗费6个月的辛苦工作完成的。GNOME 致力于基于自由软件提供高质量的用户体验。开发在开放中进行,任何人都可以参与。如果你希望支持我们,你也可以成为 GNOME 的朋友

DawnDIY 翻译至 http://www.gnome.org/news/2012/09/gnome-3-6-released/

PyGtk学习笔记(7)–工具栏

Published on:
Tags: PyGtk, Python

在前面的Gtk学习中我们构造界面用到 Menu 菜单,菜单当然是让我们能方便的选择某一项功能,但是如果一个我们经常用到的菜单项在二级菜单下面,或者更深,这样一来就显得非常不方便啦。所以我们又有了更显而易见的控件– Toolbar (工具栏)。是的,工具栏通常把我们经常使用的按钮及其功能列出在一栏上面,这样就可以轻松通过鼠标的一次点击即可。就像IE、Firefox的前进和后退、地址栏、刷新等,这几个都是我们浏览网页最常用的几个功能,所以这写浏览器也会将这几个按钮列出在一栏里面供快捷使用。所以,如果你的软件功能繁多,但是想为用户提供几个常用到的快捷按钮,那就使用 Toolbar 吧。

一.介绍

一个简单的 Toolbar 就是这样的,如下图:[![][2]][2]

上面的 工具栏 中包含了4个按钮和一个分隔符,并且倒数第二个按钮是灰色的,不可用状态。OK,了解了上面的 Toolbar 长什么样,接下来我们就来实现它。

二.Toolbar(工具栏)

Toolbar的继承关系:

-- gobject.GObject
   -- gtk.Object
     -- gtk.Widget
       -- gtk.Container
         -- gtk.Toolbar

Toolbar类的概要:

class gtk.Toolbar(gtk.Container):
    gtk.Toolbar()

    def insert(item, pos)

    def get_item_index(item)

    def get_n_items()

    def get_nth_item(n)

    def get_drop_index(x, y)

    def set_drop_highlight_item(tool_item, index)

    def set_show_arrow(show_arrow)

    def get_show_arrow()

    def get_relief_style()

    def append_item(text, tooltip_text, tooltip_private_text, icon, callback, user_data=None)

    def prepend_item(text, tooltip_text, tooltip_private_text, icon, callback, user_data)

    def insert_item(text, tooltip_text, tooltip_private_text, icon, callback, user_data, position)

    def insert_stock(stock_id, tooltip_text, tooltip_private_text, callback, user_data, position)

    def append_space()

    def prepend_space()

    def insert_space(position)

    def remove_space(position)

    def append_element(type, widget, text, tooltip_text, tooltip_private_text, icon, callback, user_data)

    def prepend_element(type, widget, text, tooltip_text, tooltip_private_text, icon, callback, user_data)

    def insert_element(type, widget, text, tooltip_text, tooltip_private_text, icon, callback, user_data, position)

    def append_widget(widget, tooltip_text, tooltip_private_text)

    def prepend_widget(widget, tooltip_text, tooltip_private_text)

    def insert_widget(widget, tooltip_text, tooltip_private_text, position)

    def set_orientation(orientation)

    def set_style(style)

    def set_icon_size(icon_size)

    def set_tooltips(enable)

    def unset_style()

    def unset_icon_size()

    def get_orientation()

    def get_style()

    def get_icon_size()

    def get_tooltips()

 构造方法:

gtk.Toolbar()

Returns :

一个新的 Toolbar (工具栏)对象

常用方法:

gtk.Toolbar.insert

def insert(item, pos)

item :

一个 gtk.ToolItem 对象

pos :

新项目的位置(0,1,2 …)

注:
这个方法在PyGTK 2.4以及以上版本才可用。

通过 insert() 方法可以在工具栏中添加 ToolItem ,用 pos 来确定其位置,如果 pos 为0,则表示该 Item 在工具栏的起始位置。

gtk.Toolbar.set_style“

def set_style(style)

style :

样式,包括:  gtk.TOOLBAR_ICONS (仅图标), gtk.TOOLBAR_TEXT(仅文字), gtk.TOOLBAR_BOTH(全部) or gtk.TOOLBAR_BOTH_HORIZ(水平全部)

通过过 set_style() 方法,我们可以为 Toolbar 设置显示样式。

gtk.Toolbar.set_icon_size

def set_icon_size(icon_size)

icon_size :

图标的尺寸。“

通过 set_icon_size() 方法可以设置显示在 Toolbar 上的图标的尺寸。icon_size 的值如下:

  • gtk.ICON_SIZE_MENU
  • gtk.ICON_SIZE_SMALL_TOOLBAR
  • gtk.ICON_SIZE_LARGE_TOOLBAR
  • gtk.ICON_SIZE_BUTTON
  • gtk.ICON_SIZE_DND, or
  • gtk.ICON_SIZE_DIALOG

三.完整代码

了解了上面的基本方法,我们就可以看实现前面的图的完整代码啦。

#!/usr/bin/env python
# -*- coding: utf-8 -*

# Toolbar
# PyGtk Study Notes By DawnDIY
# http://www.dawndiy.com

import pygtk
pygtk.require('2.0')
import gtk

class Toolbar:
    def __init__(self):
        self.win = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.win.set_title("Toolbar")
        self.win.set_size_request(300,250)
        self.win.set_position(gtk.WIN_POS_CENTER)

        toolbar = gtk.Toolbar()
        #工具栏仅显示图标
        toolbar.set_style(gtk.TOOLBAR_ICONS)

        #工具栏图标的尺寸
        toolbar.set_icon_size(gtk.ICON_SIZE_LARGE_TOOLBAR) 

        #新建工具栏按钮
        newtb = gtk.ToolButton(gtk.STOCK_NEW)
        opentb = gtk.ToolButton(gtk.STOCK_OPEN)
        sep = gtk.SeparatorToolItem()  #工具栏的分隔符
        closetb = gtk.ToolButton(gtk.STOCK_CLOSE)
        exittb = gtk.ToolButton(gtk.STOCK_QUIT)

        exittb.connect("clicked", gtk.main_quit)

        #设置CLOSE按钮不可用
        closetb.set_sensitive(False)

        #添加工具栏按钮
        toolbar.insert(newtb, 0)
        toolbar.insert(opentb, 1)
        toolbar.insert(sep, 2)
        toolbar.insert(closetb, 3)
        toolbar.insert(exittb, 4)

        vbox = gtk.VBox()
        vbox.pack_start(toolbar, False, False, 0)
        self.win.add(vbox)

        self.win.connect("destroy", gtk.main_quit)
        self.win.show_all()

if __name__ == "__main__":
    toolbar = Toolbar()
    gtk.main()

按照我在代码中给出的注释就很容易懂啦。然后动手改一改 icon_size 、style 等等,你会找到你想要的效果的!打完手工,待续。。。。。。

 

 

Copyright © 2013 DawnDIY . Powered by Octopress | Theme fabric by Pankaj Kumar