wxPython 教程(十四) 提示和技巧
转自:http://thisis.yorven.site/blog/index.php/2017/10/11/wxpython-tips/
本节,我们将讲解一些 wxPython 有趣的技巧。
交互按钮
当我们用鼠标进入到按钮区域时, wx.EVT_ENTER_WINDOW 事件将被触发。类似的,当鼠标离开按钮时,wx.EVT_LEAVE_WINDOW 也会被触发。我们对这两个事件进行绑定。
#!/usr/bin/python |
我们用了 GenButton 代替了基础的 wx.Button。
from wx.lib.buttons import GenButton |
GenButton 位于 wx.lib.buttons 模块。
btn.SetBezelWidth(1) |
SetBezelWidth() 方法会创建 3D 效果。
def OnEnter(self, e): |
当鼠标移至按钮时,我们修改按钮的背景色。
Isabelle
当应用出错时,一般会弹出一个错误对话框,这可能会有些讨厌。SAP 系统中有一种更好的解决办法:当用户输入无效命令时,状态栏会变红,并输出错误信息。红色比较吸引眼球,用户可以很容易的读取错误信息。下面的代码模拟了该场景。
#!/usr/bin/python |
在状态栏有一个 wx.TextCtrl 控件,可以接受输入命令。我们定义了 3 个命令: /bye, /about, /beep。如果输错了,状态栏会变红,并输入错误。这些是通过 wx.Timeer 类完成的。
Undo/Redo 框架
许多应用允许用户撤销、反撤销他们的操作,下面的例子展示了如何在 wxPython 中完成这样的功能。
#!/usr/bin/python |
stockUndo = [] |
有两个 list 对象。stockUndo 存储所有我们可以撤销的操作, stockRedo 存储所有可以反撤销的操作。改变的内容实例化至 UndoText 对象,该对象有两个方法: undo 和 redo。
class MySheet(CSheet): |
我们的例子继承自 CSheet 类,它是一个有一些额外逻辑功能的 grid 控件。
self.SetRowLabelAlignment(wx.ALIGN_CENTRE, wx.ALIGN_CENTRE) |
我们对 label 做了居中对齐。
r = event.GetRow() |
每次我们进行修改时,都会创建一个 UndoText 对象,被附加到stockUndo list中。
if stockRedo: |
基本上,如果我们撤销了一些修改,然后重新输入,所有的 redo 修改都会丢失,OpenOffice Calc 是这样的,Gnumeric 也一样。
if len(stockUndo) == 0: |
undo 和 redo 按钮各自 enable 或 disable,比如,如果没有什么可以撤销的,那撤销按钮就被禁用。
a = stockUndo.pop() |
如果我们点击 undo,我们会从 stockUndo list 中 pop 一个 UndoText 对象,然后调用 undo(),并将对象附加到 stockRedo list。
应用配置设置
很多应用允许用户配置他们的设置,可以开关工具栏、改变字体、修改默认下载路径等等。多数情况下,他们有一个菜单项叫做 preferences。应用设置被存储在硬盘中,所以用户不需要每次打开应用的时候都修改设置。
在 wxPython 中,我们有 wx.Config 来完成这些事情。
在 Linux 中,设置被存储在隐藏文件中,该文件默认位于主文件夹下,当然路径是可以修改的。文件名在 wx.Config 的构造函数中可以修改。在下面的例子中,我们可以配置窗口的大小。如果没有配置文件,高和宽会被默认配置为 250px。我们可以设置从 200 到 500px,保存后重启程序将看到效果。
#!/usr/bin/python |
我们在代码中获取到配置文件的内容,包括两个键值对。
$ cat .myconfig |
鼠标手势
鼠标手势结合鼠标动作和点击来完成特定任务。我们可以在 FireFox 或者 Opera 中看到鼠标手势的应用,可以帮我们节省很多时间。在 wxPython 中,可以使用 wx.lib.gestures.MouseGestures 类来完成鼠标手势。
可用的手势:
- L for left
- R for right
- U for up
- D for down
- 7 for northwest
- 9 for northeast
- 1 for southwest
- 3 for southeast
如果你好奇为什么会选用这些数字,你可以看一下数字小键盘。当我们按下鼠标指针画一个正方形时,手势 ‘RDLU’ 将被触发。
可用的标识:
- wx.MOUSE_BTN_LEFT
- wx.MOUSE_BTN_MIDDLE
- wx.MOUSE_BTN_RIGHT
#!/usr/bin/python |
在上面的例子中,我们注册了一个鼠标手势。当左键点击,同时鼠标向下、右滑动时,这个手势会被触发,然后会关闭应用。
mg = gest.MouseGestures(panel, True, wx.MOUSE_BTN_LEFT) |
如果我们要使用鼠标手势,我们需要创建一个 MouseGesture 对象。第一个参数是一个窗口,手势要向该窗口注册。第二个参数定义了注册的方式,True 代表自动注册,False 代表手动注册。最后一个参数定义了鼠标的按键,表明当触发的时候需要按的键。之后可以通过 SetMouseButton() 来修改。
mg.SetGesturePen(wx.Colour(255, 0, 0), 2) |
我们的手势将会被绘制成红色的线,宽为 2px。
mg.SetGesturesVisible(True) |
使用上面的方法可以让手势可见。
mg.AddGesture('DR', self.OnDownRight) |
我们使用 AddGesture() 方法注册一个鼠标手势。第一个参数是手势,第二个参数是需要触发的方法。
在本节,我们讲解了一些 wxPython 的技巧。
wxPython 教程(十四) 提示和技巧