Google

星期三, 七月 30, 2008

无题

雨横风狂,山海如皱,人行碌碌似羔羊。
低眉思量,曾牵素手,难道人心最无常?

标签:

星期日, 七月 27, 2008

无题


花一朵,酒一壶,伤心处,相思都做丝线,宿醉做机杼。

标签:

星期四, 七月 24, 2008

XRC方式载入的wxPython对象访问方式

res = xrc.XmlResource(’resource.xrc’)
res.LoadPanel(self, ‘MyPanel’)

self.Bind(wx.EVT_BUTTON, self.OnClose, id=xrc.XRCID(’CloseButton’))
self.Center()

标签: , , ,

正版打酱油诗

冲动是魔鬼,没事拽你腿,先拽你左腿,后拽你右腿,拽完你双腿,再去撕你嘴,有口不能言,心里常后悔。

标签:

星期三, 七月 23, 2008

无题

昨夜饮酒过度,人渐迷离无助,醉眼看同桌,推洒扎啤无数,湿裤,湿裤,回程长风满路。

标签:

星期五, 七月 18, 2008

无题

连街小雨润如油,一样相思别无求,留连故地无心去,仰听天籁胜箜篌。

张琰昨日抵连,可惜今日不能做陪。

标签:

用wxPython实现Tray Icon

class MyTaskBarIcon(wx.TaskBarIcon):
...

##
# The task bar application
#
class TaskBarApp(wx.Frame):

##
# \brief the constructor
#
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, -1, title, size = (1, 1),
style=wx.FRAME_NO_TASKBAR|wx.NO_FULL_REPAINT_ON_RESIZE)

self.tbicon = MyTaskBarIcon(self)

http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/475155

标签: , ,

无题

十年未相遇,相见两唏嘘。

我胖了,我还是我么?

标签:

星期三, 七月 16, 2008

wxPython之XRC加载流水账.2

用下面的代码,执行结果是正确的。不知道为什么,如果有StatusBar,总会少一点,resize之后正常。

#-*- coding: utf-8 -*-

import wx
import wx.xrc as xrc

class MyApp(wx.App):
def OnInit(self):
self.res = xrc.XmlResource(r'./cr01.xrc')
self.frame_1 = self.res.LoadFrame(None, 'MyFrame2')
self.frame_1.Show(True)
return 1

if '__main__' == __name__:
app = MyApp()
app.MainLoop()

重要的参考文件 :
wxPython中XRC文件i18n示例

标签: , ,

wxPython之XRC加载流水账

按图索骥一番,用以下代码测试一下:

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

import wx
import wx.xrc as xrc

class XML(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title)

res = xrc.XmlResource('cr01.xrc')
res.LoadFrame(self, 'MyFrame2')

self.Center()
self.Show(True)

def OnClose(self, event):
self.Close()

app = wx.App()
XML(None, -1, 'xml resource test')
app.MainLoop()

cr01.xrc里定义了数个组件,发现载入进来的只是一个空框架。

参考文件 :http://privacybrowse.info/index.php?hl=f5&q=uggc%3A%2F%2Fzejyjna.jbeqcerff.pbz%2F2008%2F05%2F03%2Fjkclguba%25RS%25OP%259Nkep%2F

标签: , ,

随笔

人言昨夜雨,风骤云涂鸦,烹茶问窗外,雨打合欢花。

标签:

星期二, 七月 15, 2008

Python in Action中文翻译

项目地址:
http://www.mangbar.com/task/doclist/5d023b211427315f01142a6590000324

标签:

11.3.3 什么是box sizer?[wxPython in Action]

box sizer是wxPython所提供的sizer 中的最简单和最灵活的sizer。一个box sizer是一个垂直列或水平行,窗口部件在其中从左至右或从上到下布置在一条线上。虽然这听起来好像用处 太简单,但是来自相互之间嵌套sizer的能力使你能够在每行或每列很容易放置不同数量的项目。由于每个sizer都是一个独立的实体,因此你的布局就有 了更多的灵活性。对于大多数的应用程序,一个嵌套有水平sizer的垂直sizer将使你能够创建你所需要的布局。

图11.11-11.14 展示了几个简单的box sizer的例子。图中所展示的各个框架我们都是手动调整了大小的,以便展示每个sizer是如何响应框架的增大的。图 11.11显示了一个水平的box sizer,图11.12在一个垂直的box sizer显示了现图11.11相同的窗口部件。

图11.11


图11.12


图11.13显示了一个垂直的sizer,其中一个窗口部件被设置成可扩展并填充有效的垂直空间。图11.14展示了一个垂直的sizer,其中的两个窗口部件设置为按不同的比例占据有效的垂直空间。

图11.13


图11.14


生成以上四个sizer框架的示例代码如例11.9所示。

例11.9 产生多个box sizer

import wx
from blockwindow import BlockWindow

labels = "one two three four".split()

class TestFrame(wx.Frame):
title = "none"
def __init__(self):
wx.Frame.__init__(self, None, -1, self.title)
sizer = self.CreateSizerAndWindows()
self.SetSizer(sizer)
self.Fit()

class VBoxSizerFrame(TestFrame):
title = "Vertical BoxSizer"

def CreateSizerAndWindows(self):
sizer = wx.BoxSizer(wx.VERTICAL)
for label in labels:
bw = BlockWindow(self, label=label, size=(200,30))
sizer.Add(bw, flag=wx.EXPAND)
return sizer


class HBoxSizerFrame(TestFrame):
title = "Horizontal BoxSizer"

def CreateSizerAndWindows(self):
sizer = wx.BoxSizer(wx.HORIZONTAL)
for label in labels:
bw = BlockWindow(self, label=label, size=(75,30))
sizer.Add(bw, flag=wx.EXPAND)
return sizer

class VBoxSizerStretchableFrame(TestFrame):
title = "Stretchable BoxSizer"

def CreateSizerAndWindows(self):
sizer = wx.BoxSizer(wx.VERTICAL)
for label in labels:
bw = BlockWindow(self, label=label, size=(200,30))
sizer.Add(bw, flag=wx.EXPAND)

# Add an item that takes all the free space
bw = BlockWindow(self, label="gets all free space", size=(200,30))
sizer.Add(bw, 1, flag=wx.EXPAND)
return sizer

class VBoxSizerMultiProportionalFrame(TestFrame):
title = "Proportional BoxSizer"

def CreateSizerAndWindows(self):
sizer = wx.BoxSizer(wx.VERTICAL)
for label in labels:
bw = BlockWindow(self, label=label, size=(200,30))
sizer.Add(bw, flag=wx.EXPAND)

# Add an item that takes one share of the free space
bw = BlockWindow(self,
label="gets 1/3 of the free space",
size=(200,30))
sizer.Add(bw, 1, flag=wx.EXPAND)

# Add an item that takes 2 shares of the free space
bw = BlockWindow(self,
label="gets 2/3 of the free space",
size=(200,30))
sizer.Add(bw, 2, flag=wx.EXPAND)
return sizer

app = wx.PySimpleApp()
frameList = [VBoxSizerFrame, HBoxSizerFrame,
VBoxSizerStretchableFrame,
VBoxSizerMultiProportionalFrame]
for klass in frameList:
frame = klass()
frame.Show()
app.MainLoop()

box sizer是类wx.BoxSizer的实例,wx.BoxSizer是wx.Sizer的子类,相对于wx.Sizer,wx.BoxSizer几乎没有增加新的方法。wx.BoxSizer的构造函数有一个参数:

wx.BoxSizer(orient)

参 数orient代表该sizer的方向,它的取值可以是wx.VERTICAL或wx.HORIZONTAL。对于box sizer所定义的唯一一个新 的方法是GetOrientation(),它返回构造函数中orient的整数值。一旦一个box sizer被创建后,你就不能改变它的方向了。 box sizer的其它的函数使用本章早先所讨论的一般的sizer的方法。

box sizer的布局算法对待该sizer的主方向 (当构建的时候已被它的方向参数所定义)和次要方向是不同的。特别地,proportion参数只适用于当sizer沿主方向伸缩时,而 wx.EXPAND标记仅适用于当sizer的尺寸在次方向上变化时。换句话说,当一个垂直的box sizer被垂直地绘制时,传递给每个Add()方 法调用的参数proportion决定了每个项目将如何垂直地伸缩。除了影响sizer和它的项目的水平增长外,参数proportion以同样的方式影 响水平的box sizer。在另一方面,次方向的增长是由对项目所使用的wx.EXPAND标记来控制的,所以,在一个垂直的box sizer中的项 目将只在水平方向增长,如果它们设置了wx.EXPAND标记的话,否则这些项目保持它们的最小或最合适的尺寸。图6.7演示了这个过程。

在box sizer 中,项目的比例增长类似于flex grid sizer,但有一些例外。第一,box sizer的比例行为是在窗口部件被添加到该sizer时,使用 proportion参数被确定的——你无需像flex grid sizer那样单独地指定它的增长性。第二,比例为0的行为是不同的。在 box sizer中,0比例意味着该窗口部件在主方向上不将根据它的最小或最合适尺寸被调整尺寸,但是如果wx.EXPAND标记被使用了的话,它仍可 以在次方向上增长。当box sizer在主方向上计算它的项目的布局时,它首先合计固定尺寸的项目所需要的空间,这些固定尺寸的项目,它们的比例为0。 余下的空间按项目的比例分配。

标签: , ,

wxWidgets界面设计工具

[Commerial]
DialogBlocks http://www.anthemion.co.uk/dialogblocks/
wxDesigner http://www.roebling.de/

[Free]
wxGlade http://www.roebling.de/
VisualWx http://visualwx.altervista.org/
XRCed http://xrced.sourceforge.net/

wiki:http://wiki.wxformbuilder.org/
官网:http://wxformbuilder.org/

标签: , ,

wxWidgets的Sizer

当我们需要写自己的dialog的时候,需要布置好控件的位置,界面才美观.可是如果控件比较多的化,难道我们需要对每个都指定坐标么?还有一个重要的问 题是,这个过程不是"所见即所得"!(当然现在wxWidgets也有可视的界面编辑器了,这里不考虑这个).这个对于从VC/Delphi转过来的程序 员会比较不适应,因为IDE有集成界面编辑器,非常方便调整界面.对于写过AWT(java),GTK,QT的人来说,相信都用过类似layout的东 西.wxWidgets中wxSizer就是做这个的.
  我们先说说一些基本的概念.
  1.所有的sizers都是容器.并且是可嵌套的.
  2.item的最小尺寸
  一般的控件最小尺寸就是初试化的时候的默认值.有些控件是可以计算他们的尺寸的(例如Checkbox),但是有些不好计算,例如listbox,宽高都是不确定的,因为可以有滚动条:-).有些则能计算高度,不能计算宽度,比如text control.
  3.item的边框
  包围着控件的周围的空白空间.每个控件都有自己的边框.边框的大小是可以设置的.位置也可以设置的,比如只有左边有边框,或者上下有,左右没有.
  4.item是可对齐的
   可以居中/上/小/左/右等对齐方式.
  5.item是可伸缩的
  一个item一般占用空间包括item的最小尺寸和边框.但是这个是可以伸缩的.
  6.item是可以手工设置为隐藏的
   使用wxSizer::Show函数实现.注意后面接着要调用Layout函数强制更新界面布局.当我们想隐藏部分界面的时候,这个功能非常有用.避免 我们做这样的事情:先从sizer中把控件移除,然后需要的时候在加入.但是要注意的,这个只有wxBoxSizer和wxFlexGridSizer支 持.
  我们在来看看wxWidgets都提供我们哪些类来完成控件的布局任务.
  wxSizer, wxGridSizer, wxFlexGridSizer, wxBoxSizer, wxStaticBoxSizer
  wxSizer是基类,一般我们都不直接使用.
  wxBoxSizer:
  可以指定是水平还是垂直方向排列item.只能二者选一.如果需要横竖混排,就需要嵌套使用.
  wxStaticBoxSizer:
   和wxBoxSizer一模一样,就是多了一个static box做为边框.
  wxGridSizer:
  就是表格状的排布.注意的是,所有的格子的大小都是一样的.具体的尺寸依赖item中最大的一个.
  wxFlexGridSizer:
  wxGridSizer的升级版本,每行的高度和每列的宽度是独立的.具体的大小依赖行/列中最大个高/宽.
  下面通过对wxBoxSizer的Add函数分析来详细说明wxBoxSizer使用方法.
  原形如下:
  wxSizerItem* Add(wxWindow* window, int proportion = 0,int flag = 0, int
  border = 0, wxObject* userData = NULL)
  wxSizerItem* Add(wxSizer* sizer, int proportion = 0, int flag = 0, int
  border = 0, wxObject* userData = NULL)
  一个是针对wxWindow的,一个是嵌套wxSizer用的,其他的参数都是一致的.
  参数说明:
  proportion:
  这个参数是用在wxBoxSizer的.前面说到每个wxBoxSizer是可以指定一个方向的,这个可以认为是wxBoxSizer的主方向.
  如果该参数是1,表示可以在主方向上伸缩需要加入的item.
  flag:
  指定item边框的位置(可以用"|"操作符号组合上/下/左/右).
  指定item对齐方式(可以用"|"操作符号组合上/下/左/右/垂直居中/水平居中).
   还有一个特别的wxEXPAND.指出item在非主方向是否可以伸缩,主方向的伸缩是由proportion指定.这里还有一个特别说明的(对主方向 和非主方向都有效),如果父级的sizer限制了不能伸缩尺寸,子级的sizer是不能更改的,就算设置可以伸缩也是无效的.如果父级的能伸缩,子级的 sizer可以设置为不能伸缩.
  这里就不举具体的例子说明了.确实需要可以参考wxWidgets的帮助中的"Topic
  overviews"中的"Sizer overview"的"Programming with
  wxBoxSizer".本文也是参考"Sizer overview"写的.
http://blog.csdn.net/Utensil/archive/2007/12/19/1953355.aspx

标签: ,

星期五, 七月 11, 2008

无题

连天小雨润如酥
雨落草丛凝滚珠
公车往来人忙碌
我笑自己不如猪

标签:

星期三, 七月 09, 2008

竽充数:Python抓网页内容的两个sample程序

Python是Google公司最重要的三大开发语言之一(C++, Java, Python)

用Python语言写搜索引擎蜘蛛的脚本非常简单、轻松。给大家分享两种抓网页内容的方法

一、用urllib2/sgmllib包,将目标网页的所有URL列出。

import urllib2

from sgmllib import SGMLParser

class URLLister(SGMLParser):
def reset(self):
SGMLParser.reset(self)
self.urls = []

def start_a(self, attrs):
href = [v for k, v in attrs if k=='href']
if href:
self.urls.extend(href)

f = urllib2.urlopen("http://www.donews.com")

if f.code == 200:
parser = URLLister()
parser.feed(f.read())
f.close()
for url in parser.urls: print url

二、用python调用IE抓取目标网页(Require win32com, pythoncom)的所有图像的url和大小

import win32com.client, pythoncom
import time

ie = win32com.client.DispatchEx('InternetExplorer.Application.1')
ie.Visible = 1
ie.Navigate("http://news.sina.com.cn")
while ie.Busy:
time.sleep(0.05)

doc = ie.Document
for i in doc.images:
print i.src, i.width, i.height

这种方法可以利用IE本身的Javascript. DHTML的支持,来做自动提交Form,和处理Javascript。
有关样例可以参考http://win32com.de

http://blog.donews.com/dengyu/archive/2005/11/09/620119.aspx

标签: , ,

用python解析html

http://rurutia.is-programmer.com/show/100.html

标签: , ,

星期五, 七月 04, 2008

Linux下Wine中文对话框乱码解决法

Wine中中文存在很多的乱码,显示成<< >> ??等,这是对对话框中"确定"等的解决:

  Wine中对话框默认的字体是Tahoma,在我们的LINUX上,Tahoma字体是无法正常显示中文的。比如Wine configuration中的"确定""取消"等就变成了"<<"">>"的字样。

  解决方法很简单:

  在wine的regedit中,找到:

  \HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\FontSubstitutes

  方法1. 直接地将这个键设为空,问题就解决了。

  方法2. 将MS Shell Dlg设置为一种自己字库中已有的中文字体即可,如果已经将windows中宋体取来使用了,字库中SimSun对应宋体(这是Windows的,LINUX下默认是没有的),在这里设置为 SimSun即可。
http://linux.chinaunix.net/news/2008/07/04/1014779.shtml

标签: , ,

星期四, 七月 03, 2008

SQL导出数据到EXCEL文件

create excel xls from t-sql
---------------------------------------------------------------------------
-- create xls script dal - 04/24/2003
--
-- designed for agent scheduling, turn on "append output for step history"
--
-- search for %%% to find adjustable constants and other options
--
-- uses ole for ado and ole db to create the xls file if it does not exist
-- linked server requires the xls to exist before creation
-- uses ole ado to create the xls worksheet for use as a table by t-sql
-- uses linked server to allow t-sql access to xls table
-- uses t-sql to populate te xls worksheet, very fast
--
print begin createxls script at +rtrim(convert(varchar(24),getdate(),121))+
print
go

set nocount on
declare @conn int -- ado connection object to create xls
, @hr int -- ole return value
, @src varchar(255) -- ole error source
, @desc varchar(255) -- ole error description
, @path varchar(255) -- drive or unc path for xls
, @connect varchar(255) -- ole db connection string for jet 4 excel isam
, @wks_created bit -- whether the xls worksheet exists
, @wks_name varchar(128) -- name of the xls worksheet (table)
, @servername nvarchar(128) -- linked server name for xls
, @ddl varchar(8000) -- jet4 ddl for the xls wks table creation
, @sql varchar(8000) -- insert into xls t-sql
, @recs int -- number of records added to xls
, @log bit -- whether to log process detail

-- init variables
select @recs = 0
-- %%% 1 = verbose output detail, helps find problems, 0 = minimal output detail
, @log = 1
-- %%% assign the unc or path and name for the xls file, requires read/write access
-- must be accessable from server via sql server service account
-- & sql server agent service account, if scheduled
set @path = c:\temp\test_+convert(varchar(10),getdate(),112)+.xls
-- assign the ado connection string for the xls creation
set @connect = provider=microsoft.jet.oledb.4.0;data source=+@path+;extended properties=excel 8.0
-- %%% assign the linked server name for the xls population
set @servername = excel_test
-- %%% rename table as required, this will also be the xls worksheet name
set @wks_name = people
-- %%% table creation ddl, uses jet4 syntax,
-- text data type = varchar(255) when accessed from t-sql
set @ddl = create table +@wks_name+ (ssn text, name text, phone text)
-- %%% t-sql for table population, note the 4 part naming required by jet4 ole db
-- insert into select, insert into values, and exec sp types are supported
-- linked server does not support select into types
set @sql = insert into +@servername+...+@wks_name+ (ssn, name, phone)
set @sql = @sql+select au_id as ssn
set @sql = @sql+, ltrim(rtrim(isnull(au_fname,)+ +isnull(au_lname,))) as name
set @sql = @sql+, phone as phone
set @sql = @sql+from pubs.dbo.authors

if @log = 1 print created ole adodb.connection object
-- create the conn object
exec @hr = sp_oacreate adodb.connection, @conn out
if @hr <> 0 -- have to use <> as ole / ado can return negative error numbers
begin
-- return ole error
exec sp_oageterrorinfo @conn, @src out, @desc out
select error=convert(varbinary(4),@hr), source=@src, description=@desc
return
end

if @log = 1 print char(9)+assigned connectionstring property
-- set a the conn objects connectionstring property
-- work-around for error using a variable parameter on the open method
exec @hr = sp_oasetproperty @conn, connectionstring, @connect
if @hr <> 0
begin
-- return ole error
exec sp_oageterrorinfo @conn, @src out, @desc out
select error=convert(varbinary(4),@hr), source=@src, description=@desc
return
end

if @log = 1 print char(9)+open connection to xls, for file create or append
-- call the open method to create the xls if it does not exist, cant use parameters
exec @hr = sp_oamethod @conn, open
if @hr <> 0
begin
-- return ole error
exec sp_oageterrorinfo @conn, @src out, @desc out
select error=convert(varbinary(4),@hr), source=@src, description=@desc
return
end

-- %%% this section could be repeated for multiple worksheets (tables)
if @log = 1 print char(9)+execute ddl to create +@wks_name+ worksheet
-- call the execute method to create the work sheet with the @wks_name caption,
-- which is also used as a table reference in t-sql
-- neat way to define column data types in excel worksheet
-- sometimes converting to text is the only work-around for excels general
-- cell formatting, even though the cell contains text, excel tries to format
-- it in a "smart" way, i have even had to use the single quote appended as the
-- 1st character in t-sql to force excel to leave it alone
exec @hr = sp_oamethod @conn, execute, null, @ddl, null, 129 -- adcmdtext + adexecutenorecords
-- 0x80040e14 for table exists in ado
if @hr = 0x80040e14
-- kludge, skip 0x80042732 for ado optional parameters (null) in sql7
or @hr = 0x80042732
begin
-- trap these ole errors
if @hr = 0x80040e14
begin
print char(9)++@wks_name+ worksheet exists for append
set @wks_created = 0
end
set @hr = 0 -- ignore these errors
end
if @hr <> 0
begin
-- return ole error
exec sp_oageterrorinfo @conn, @src out, @desc out
select error=convert(varbinary(4),@hr), source=@src, description=@desc
return
end

if @log = 1 print destroyed ole adodb.connection object
-- destroy the conn object, +++ important to not leak memory +++
exec @hr = sp_oadestroy @conn
if @hr <> 0
begin
-- return ole error
exec sp_oageterrorinfo @conn, @src out, @desc out
select error=convert(varbinary(4),@hr), source=@src, description=@desc
return
end

-- linked server allows t-sql to access the xls worksheet (table)
-- this must be performed after the ado stuff as the xls must exist
-- and contain the schema for the table, or worksheet
if not exists(select srvname from master.dbo.sysservers where srvname = @servername)
begin
if @log = 1 print created linked server +@servername+ and login
exec sp_addlinkedserver @server = @servername
, @srvproduct = microsoft excel workbook
, @provider = microsoft.jet.oledb.4.0
, @datasrc = @path
, @provstr = excel 8.0
-- no login name or password are required to connect to the jet4 isam linked server
exec sp_addlinkedsrvlogin @servername, false
end

-- have to exec the sql, otherwise the sql is evaluated
-- for the linked server before it exists
exec (@sql)
print char(9)+populated +@wks_name+ table with +convert(varchar,@@rowcount)+ rows

-- %%% optional you may leave the linked server for other xls operations
-- remember that the linked server will not create the xls, so remove it
-- when you are done with it, especially if you delete or move the file
if exists(select srvname from master.dbo.sysservers where srvname = @servername)
begin
if @log = 1 print deleted linked server +@servername+ and login
exec sp_dropserver @servername, droplogins
end
go

set nocount off
print
print finished createxls script at +rtrim(convert(varchar(24),getdate(),121))+
go

目的
set @path = c:\temp\test_+convert(varchar(10),getdate(),112)+.xls


set @sql = insert into +@servername+...+@wks_name+ (ssn, name, phone)
set @sql = @sql+select au_id as ssn
set @sql = @sql+, ltrim(rtrim(isnull(au_fname,)+ +isnull(au_lname,))) as name
set @sql = @sql+, phone as phone
set @sql = @sql+from pubs.dbo.authors
http://www.west263.com/www/info/27281-1.htm

标签: , , ,

星期三, 七月 02, 2008

无题

昨天晚上很生气,现在心情还不够好。太累了。
辽ICP备05003652号
流风洄雪听天籁,轻云蔽日看落花

Powered by Blogger