mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 18:28:49 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			137 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
| #! /usr/bin/env python
 | |
| 
 | |
| # www11.py -- display the contents of a URL in a Text widget
 | |
| # - set window title
 | |
| # - make window resizable
 | |
| # - update display while reading
 | |
| # - vertical scroll bar
 | |
| # - rewritten as class
 | |
| # - editable url entry and reload button
 | |
| # - error dialog
 | |
| 
 | |
| import sys
 | |
| import urllib
 | |
| from Tkinter import *
 | |
| import Dialog
 | |
| 
 | |
| def main():
 | |
| 	if len(sys.argv) != 2 or sys.argv[1][:1] == '-':
 | |
| 		print "Usage:", sys.argv[0], "url"
 | |
| 		sys.exit(2)
 | |
| 	url = sys.argv[1]
 | |
| 	viewer = Viewer()
 | |
| 	viewer.load(url)
 | |
| 	viewer.go()
 | |
| 
 | |
| class Viewer:
 | |
| 
 | |
| 	def __init__(self):
 | |
| 		# Create root window
 | |
| 		self.root = Tk()
 | |
| 		self.root.minsize(1, 1)
 | |
| 
 | |
| 		# Create topframe for the entry and button
 | |
| 		self.topframe = Frame(self.root)
 | |
| 		self.topframe.pack({'fill': 'x'})
 | |
| 
 | |
| 		# Create a label in front of the entry
 | |
| 		self.urllabel = Label(self.topframe, {'text': 'URL:'})
 | |
| 		self.urllabel.pack({'side': 'left'})
 | |
| 
 | |
| 		# Create the entry containing the URL
 | |
| 		self.entry = Entry(self.topframe,
 | |
| 				   {'relief': 'sunken', 'border': 2})
 | |
| 		self.entry.pack({'side': 'left', 'fill': 'x', 'expand': 1})
 | |
| 		self.entry.bind('<Return>', self.loadit)
 | |
| 
 | |
| 		# Create the button
 | |
| 		self.reload = Button(self.topframe,
 | |
| 				     {'text': 'Reload',
 | |
| 				      'command': self.reload})
 | |
| 		self.reload.pack({'side': 'right'})
 | |
| 
 | |
| 		# Create botframe for the text and scrollbar
 | |
| 		self.botframe = Frame(self.root)
 | |
| 		self.botframe.pack({'fill': 'both', 'expand': 1})
 | |
| 
 | |
| 		# The Scrollbar *must* be created first
 | |
| 		self.vbar = Scrollbar(self.botframe)
 | |
| 		self.vbar.pack({'fill': 'y', 'side': 'right'})
 | |
| 		self.text = Text(self.botframe)
 | |
| 		self.text.pack({'expand': 1, 'fill': 'both', 'side': 'left'})
 | |
| 
 | |
| 		# Link Text widget and Scrollbar
 | |
| 		self.text['yscrollcommand'] = (self.vbar, 'set')
 | |
| 		self.vbar['command'] = (self.text, 'yview')
 | |
| 
 | |
| 		self.url = None
 | |
| 
 | |
| 	def load(self, url):
 | |
| 		# Load a new URL into the window
 | |
| 		fp, url = self.urlopen(url)
 | |
| 		if not fp:
 | |
| 			return
 | |
| 
 | |
| 		self.url = url
 | |
| 
 | |
| 		self.root.title(url)
 | |
| 
 | |
| 		self.entry.delete('0', 'end')
 | |
| 		self.entry.insert('end', url)
 | |
| 
 | |
| 		self.text.delete('0.0', 'end')
 | |
| 
 | |
| 		while 1:
 | |
| 			line = fp.readline()
 | |
| 			if not line: break
 | |
| 			if line[-2:] == '\r\n': line = line[:-2] + '\n'
 | |
| 			self.text.insert('end', line)
 | |
| 			self.root.update_idletasks()
 | |
| 
 | |
| 		fp.close()
 | |
| 
 | |
| 	def urlopen(self, url):
 | |
| 		# Open a URL --
 | |
| 		# return (fp, url) if successful
 | |
| 		# display dialog and return (None, url) for errors
 | |
| 		try:
 | |
| 			fp = urllib.urlopen(url)
 | |
| 		except IOError, msg:
 | |
| 			import types
 | |
| 			if type(msg) == types.TupleType and len(msg) == 4:
 | |
| 				if msg[1] == 302:
 | |
| 					m = msg[3]
 | |
| 					if m.has_key('location'):
 | |
| 						url = m['location']
 | |
| 						return self.urlopen(url)
 | |
| 					elif m.has_key('uri'):
 | |
| 						url = m['uri']
 | |
| 						return self.urlopen(url)
 | |
| 			self.errordialog(IOError, msg)
 | |
| 			fp = None
 | |
| 		return fp, url
 | |
| 
 | |
| 	def errordialog(self, exc, msg):
 | |
| 		# Display an error dialog -- return when the user clicks OK
 | |
| 		Dialog.Dialog(self.root, {
 | |
| 			'text': str(msg),
 | |
| 			'title': exc,
 | |
| 			'bitmap': 'error',
 | |
| 			'default': 0,
 | |
| 			'strings': ('OK',),
 | |
| 			})
 | |
| 
 | |
| 	def go(self):
 | |
| 		# Start Tk main loop
 | |
| 		self.root.mainloop()
 | |
| 
 | |
| 	def reload(self, *args):
 | |
| 		# Callback for Reload button
 | |
| 		if self.url:
 | |
| 			self.load(self.url)
 | |
| 
 | |
| 	def loadit(self, *args):
 | |
| 		# Callback for <Return> event in entry
 | |
| 		self.load(self.entry.get())
 | |
| 
 | |
| main()
 | 
