代码: 全选
#!/usr/bin/env python
#coding:utf-8
import gtk
global option
option = 0
class main_window(gtk.Window):
def __init__(self, parent=None):
gtk.Window.__init__(self)
try:
self.set_screen(parent.get_screen())
except AttributeError:
self.connect('destroy', lambda *w: gtk.main_quit())
self.set_title(self.__class__.__name__)
self.set_border_width(10)
self.set_default_size(600,400)
h = gtk.HBox(); h.set_border_width(5)
label = gtk.Label("请输入url地址:")
h.pack_start( label, expand=False)
e = gtk.Entry()
self.url = e
h.add( e)
b = gtk.Button('刷新')
b.connect('clicked', self.get_url)
h.pack_start( b, expand=False)
b = gtk.Button('选择一个文件')
b.connect('clicked', self.get_file)
h.pack_start( b, expand=False)
v = gtk.VBox(); v.set_border_width(5)
v.pack_start( h, expand= False)
f = gtk.Frame('txt')
self.f = f
print dir( f)
t , sw = self.get_textview()
tmp = gtk.VBox()
tmp.add( sw)
h = gtk.HBox(); h.set_border_width(5)
b = gtk.Button('下一个')
b. connect( 'clicked', self.move_next, False)
self.next= b
h.pack_end( b, expand=False)
b = gtk.Button('上一个')
b. connect( 'clicked', self.move_next, True)
self.pre= b
h.pack_end( b, expand=False)
e = gtk.Entry()
e. connect( 'changed', self.search_text)
h.pack_end( e, expand=False)
label = gtk.Label("查找:")
self.label = label
h.pack_end( label, expand=False)
tmp.pack_start( h, False)
f.add( tmp)
v.pack_start( f)
self.textview = t
b = t.get_buffer()
self.find_tag = b.create_tag( foreground="red")
self.now_tag = b.create_tag( foreground="red",background="green")
print b.insert(b.get_iter_at_offset(0),'text!')
b.insert(b.get_end_iter(),'2text!')
for i in range(20):b.insert(b.get_end_iter(),'\n2text!')
#print dir(b)
b.insert_at_cursor('kdjf')
#print dir(s)
print b.get_text(b.get_start_iter(),b.get_end_iter())
print b.get_line_count()
b.delete(b.get_start_iter(),b.get_end_iter())
self.txt = b
h = gtk.HBox(); h.set_border_width(5)
label = gtk.Label("请输入out = re.findall(r'%s',txt,option)中的正则表达式,将代入%s位置:")
h.pack_start( label, expand=False)
e = gtk.Entry()
self.retxt = e
h.add( e)
b = gtk.Button('确定')
b.connect('clicked', self.get_out)
h.pack_start( b, expand=False)
v.pack_start( h, expand=False)
h = gtk.HBox(); h.set_border_width(5)
c = gtk.CheckButton(label=None)
c.set_label('re.IGNORECASE')
c.connect("toggled", self.option)
h.pack_end( c, expand=False)
c = gtk.CheckButton(label=None)
c.set_label('re.DOTALL')
c.connect("toggled", self.option)
h.pack_end( c, expand=False)
c = gtk.CheckButton(label=None)
c.set_label('re.M')
c.connect("toggled", self.option)
h.pack_end( c, expand=False)
label = gtk.Label("其它参数option:")
h.pack_end( label, expand=False)
v.pack_start( h, expand=False)
f = gtk.Frame('输出结果')
t , sw = self.get_textview()
f.add( sw)
v.add( f)
self.out = t.get_buffer()
self.add( v)
self.show_all()
test = self.decode( u'你'.encode('utf8'))
print test, isinstance( test, unicode)
def search_text(self, w, *data):
print w.get_text()
self.rlist = self. search( self.textview, w.get_text(), self.find_tag)
if self.rlist:self.label.set_text('查找:('+str( len(self.rlist))+ ')')
else:self.label.set_text('查找:')
self.now = 0
self.scrollto( self.textview, self.rlist, self.now, self.now_tag)
def move_next(self, w, data):
print w, data, self.now
if data:
self.now -=1
else:
self.now +=1
if self.now< 0: self.now = len( self.rlist)-1
if self.now> len( self.rlist)-1: self.now = 0
self.scrollto( self.textview, self.rlist, self.now, self.now_tag)
def search(self, textview, text, find_tag):
b = textview.get_buffer()
start, end = b.get_bounds()
b.remove_tag( find_tag, start, end)
#iter = b.get_iter_at_mark(b.get_insert())
iter = b.get_iter_at_offset(0)
find_list = []
if not text:
return find_list
while 1:
res = iter.forward_search( text,gtk.TEXT_SEARCH_VISIBLE_ONLY|gtk.TEXT_SEARCH_TEXT_ONLY)
if not res: break
match_start, match_end = res
find_list.append( res)
#iter.backward_search('kd',gtk.TEXT_SEARCH_VISIBLE_ONLY|gtk.TEXT_SEARCH_TEXT_ONLY)
b.apply_tag( find_tag, match_start, match_end)
iter = match_end
return find_list
def scrollto(self, textview, find_list, index, now_tag):
b = textview.get_buffer()
start, end = b.get_bounds()
b.remove_tag( now_tag, start, end)
if find_list and index in range( len( find_list)):
start, end = find_list[index]
b.apply_tag( now_tag, start, end)
mark = b.create_mark(None, start, False)
textview.scroll_to_mark(mark, 0, True, 0.0, 1.0)
b.delete_mark(mark)
def option(self, w, *data):
print w, w.get_label(), w.get_active()
global option
import re
if w.get_active():
if w.get_label()== 're.M':
option = option + re.M
elif w.get_label()== 're.IGNORECASE':
option = option + re.IGNORECASE
elif w.get_label()== 're.DOTALL':
option = option + re.DOTALL
else:
if w.get_label()== 're.M':
option = option - re.M
elif w.get_label()== 're.IGNORECASE':
option = option - re.IGNORECASE
elif w.get_label()== 're.DOTALL':
option = option - re.DOTALL
print option
def decode(self, text, code=['utf8','gbk','gb2312']):
out = ''
for i in code:
try:out = text.decode( i)
except:pass
else: break
return out=='' and text or out
def get_file(self, data):
print data
f = gtk.FileChooserDialog( title=None,action=gtk.FILE_CHOOSER_ACTION_OPEN,buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))
r = f.run()
if r == gtk.RESPONSE_OK:
print f.get_filename(),f.get_current_folder()
self.txt.delete( self.txt.get_start_iter(),self.txt.get_end_iter())
out = open( f.get_filename()).read()
out = self.decode( out)
self.txt.insert_at_cursor( out )
self.f.set_label( 'txt 来自文件:'+f.get_filename())
f.destroy()
def get_url(self, data):
url = self.url.get_text()
if not url:
return
print url
import urllib2, re
t = urllib2.urlopen( url)
out= t.read()
#code = re.findall(r'text/html;\s*charset=\s*([^\ \'\"]*)',out) or re.findall(r'text/html;\s*charset=\s*([^\ \'\"]*)',t.headers.get('content-type'))
#print t.headers.get('content-type')
#print code
#if code:out = out.decode( code[0])
#print t.headers
out = self.decode( out)
if out:
self.txt.delete( self.txt.get_start_iter(),self.txt.get_end_iter())
self.txt.insert_at_cursor( out)
self.f.set_label( 'txt 来自url:'+url[:60]+ (len(url)>60 and '...' or '') )
def get_out(self, data):
txt = self.txt.get_text(self.txt.get_start_iter(),self.txt.get_end_iter())
import re
global option
out = re.findall(r'%s'% self.retxt.get_text(),txt, option)
self.out.delete( self.out.get_start_iter(),self.out.get_end_iter())
self.out.insert_at_cursor( 'str(out):\n')
self.out.insert_at_cursor( str(out))
self.out.insert_at_cursor( '\n\nlen(out):\n')
self.out.insert_at_cursor( str(len(out)))
self.out.insert_at_cursor( '\n\n\'\\n\\n\'.join(out):[注:经过处理,如果是同时抓取多个则每行结果用一个换行分开,不同行用两个换行分开。]\n')
if out and isinstance( out[0] , tuple):
out = ['\n'.join(i) for i in out]
self.out.insert_at_cursor( '\n\n'.join(out))
def get_textview(self):
sw = gtk.ScrolledWindow()
sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
t = gtk.TextView()
t.set_wrap_mode(gtk.WRAP_CHAR)#自动换行,按字符 gtk.WRAP_CHAR.real==1
sw.add( t)
return t, sw
def main():
main_window()
gtk.main()
if __name__ == '__main__':
main()