Archive for the ‘Python 2.7’ Category
Install EasyGUI on Fedora
The EasyGUI library is a nice tool for developing GUI applications. It doesn’t require you to know event-driven programming to write basic GUI applications because it’s based on Python functions.
You can download and install the EasyGUI library with yum
utility like this:
yum install -y python-easygui |
It should generate the following list:
Loaded plugins: langpacks, refresh-packagekit mysql-connectors-community | 2.5 kB 00:00 mysql-tools-community | 2.5 kB 00:00 mysql56-community | 2.5 kB 00:00 pgdg93 | 3.6 kB 00:00 updates/20/x86_64/metalink | 2.8 kB 00:00 Resolving Dependencies --> Running transaction check ---> Package python-easygui.noarch 0:0.96-7.fc20 will be installed --> Processing Dependency: tkinter for package: python-easygui-0.96-7.fc20.noarch --> Processing Dependency: python-setuptools for package: python-easygui-0.96-7.fc20.noarch --> Running transaction check ---> Package python-setuptools.noarch 0:1.4.2-1.fc20 will be installed ---> Package tkinter.x86_64 0:2.7.5-16.fc20 will be installed --> Processing Dependency: libtk8.5.so()(64bit) for package: tkinter-2.7.5-16.fc20.x86_64 --> Processing Dependency: libtcl8.5.so()(64bit) for package: tkinter-2.7.5-16.fc20.x86_64 --> Processing Dependency: libTix.so()(64bit) for package: tkinter-2.7.5-16.fc20.x86_64 --> Running transaction check ---> Package tcl.x86_64 1:8.5.14-1.fc20 will be installed ---> Package tix.x86_64 1:8.4.3-11.fc20 will be installed ---> Package tk.x86_64 1:8.5.14-1.fc20 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: python-easygui noarch 0.96-7.fc20 fedora 481 k Installing for dependencies: python-setuptools noarch 1.4.2-1.fc20 updates 413 k tcl x86_64 1:8.5.14-1.fc20 fedora 1.9 M tix x86_64 1:8.4.3-11.fc20 fedora 253 k tk x86_64 1:8.5.14-1.fc20 fedora 1.4 M tkinter x86_64 2.7.5-16.fc20 updates 316 k Transaction Summary ================================================================================ Install 1 Package (+5 Dependent packages) Total download size: 4.7 M Installed size: 13 M Downloading packages: (1/6): python-setuptools-1.4.2-1.fc20.noarch.rpm | 413 kB 00:00 (2/6): python-easygui-0.96-7.fc20.noarch.rpm | 481 kB 00:00 (3/6): tkinter-2.7.5-16.fc20.x86_64.rpm | 316 kB 00:00 (4/6): tix-8.4.3-11.fc20.x86_64.rpm | 253 kB 00:01 (5/6): tcl-8.5.14-1.fc20.x86_64.rpm | 1.9 MB 00:01 (6/6): tk-8.5.14-1.fc20.x86_64.rpm | 1.4 MB 00:03 -------------------------------------------------------------------------------- Total 1.5 MB/s | 4.7 MB 00:03 Running transaction check Running transaction test Transaction test succeeded Running transaction (shutdown inhibited) Installing : 1:tcl-8.5.14-1.fc20.x86_64 1/6 Installing : 1:tk-8.5.14-1.fc20.x86_64 2/6 Installing : 1:tix-8.4.3-11.fc20.x86_64 3/6 Installing : tkinter-2.7.5-16.fc20.x86_64 4/6 Installing : python-setuptools-1.4.2-1.fc20.noarch 5/6 Installing : python-easygui-0.96-7.fc20.noarch 6/6 Verifying : 1:tk-8.5.14-1.fc20.x86_64 1/6 Verifying : tkinter-2.7.5-16.fc20.x86_64 2/6 Verifying : 1:tix-8.4.3-11.fc20.x86_64 3/6 Verifying : 1:tcl-8.5.14-1.fc20.x86_64 4/6 Verifying : python-easygui-0.96-7.fc20.noarch 5/6 Verifying : python-setuptools-1.4.2-1.fc20.noarch 6/6 Installed: python-easygui.noarch 0:0.96-7.fc20 Dependency Installed: python-setuptools.noarch 0:1.4.2-1.fc20 tcl.x86_64 1:8.5.14-1.fc20 tix.x86_64 1:8.4.3-11.fc20 tk.x86_64 1:8.5.14-1.fc20 tkinter.x86_64 0:2.7.5-16.fc20 Complete! |
You can then test the EasyGUI library with the following three lines of code inside the IDLE interpreter:
Python 2.7.5 (default, Apr 10 2015, 08:09:05) [GCC 4.8.3 20140911 (Red Hat 4.8.3-7)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import easygui >>> flavor = easygui.enterbox("What flavor of bum do you like?") >>> if easygui.msgbox("You like " + flavor + " gum.") == 'OK': ... print "OK button clicked ..." ... OK button clicked ... |
The easygui.enterbox
call displays the image below. Enter “Peppermint” in the entry box and click the OK
button to assign the “Peppermint” string literal to the flavor
variable.
The easygui.msgbox
call displays the message below:
When you click the OK button, the program returns an “OK” string to the Python code. It prints the string “OK button clicked …” string:
As always, I hope this helps those looking for instructions and a quick way to play with Python and GUI applications.
Basic Python Object
One of my students wanted a quick example of a Python object with getters and setters. So, I wrote a little example that I’ll share.
You define this file in a physical directory that is in your $PYTHONPATH, like this:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | # Define Coordinate class. class Coordinate: # The method that initializes the Coordinate class. def __init__ (self, x, y): self.x = x self.y = y # Gets the x value from the instance. def getX (self): return self.x # Gets the y value from the instance. def getY (self): return self.y # Sets the x value in the instance. def setX (self, x): self.x = x # Sets the y value in the instance. def setY (self, y): self.y = y # Prints the coordinate pair. def printCoordinate(self): print (self.x, self.y) |
Assuming the file name is Coordinate.py, you can put it into the Python Idle environment with the following command:
from Coordinate import Coordinate |
You initialize the class, like this:
g = Coordinate(49,49) |
Then, you can access the variables of the class or it’s methods as shown below:
# Print the retrieved value of x from the g instance of the Coordinate class. print g.getX() # Print the formatted and retrieved value of x from the g instance of the Coordinate class. print "[" + str(g.getX()) + "]" # Set the value of x inside the g instance of the Coordinate class. print g.setX(39) # Print the Coordinates as a set. g.printCoordinate() |
You would see the following results:
49 [49] (39,49) |
As always, I hope that helps those looking for a solution.
Create a Python Module
Sometime formal programming documentation is less than clear. At least, it’s less than clear until you’ve written your first solution. The Modules section of the Python language is one of those that takes a few moments to digest.
Chapters 22 and 23 in Learning Python gives some additional details but not a clear step-by-step approach to implementing Python modules. This post is designed to present the steps to write, import, and call a Python module. I figured that it would be helpful to write one for my students, and posting it in the blog seemed like the best idea.
I wrote the module to parse an Oracle version string into what we’d commonly expect to see, like the release number, an “R”, a release version, and then the full version number. The module name is more or less equivalent to a package name, and the file name is effectively the module name. The file name is strVersionOracle.py
, which makes the strVersionOracle
the module name.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # Parse and format Oracle version. def formatVersion(s): # Split string into collection. list = s.split(".") # Iterate through the result set. for i, l in enumerate(list): if i == 0 and list[i] == "11": label = str(l) + "g" elif i == 0 and list[i] == "12": label = label + str(l) + "c" elif i == 1: label = label + "R" + list[i] + " (" + s + ")" # Return the formatted string. return label |
You can put this in any directory as long as you add it to the Python path. There are two Python paths to maintain. One is in the file system and the other is in Python’s interactive IDLE environment. You can check the contents of the IDLE path with the following interactive commands:
import sys print sys.path |
It prints the following:
['', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/lib64/python2.7/site-packages/gtk-2.0', '/usr/lib/python2.7/site-packages'] |
You can append to the IDLE path using the following command:
sys.path.append("/home/student/Code/python") |
After putting the module in the runtime path, you can test the code in the IDLE environment:
1 2 3 | import cx_Oracle db = cx_Oracle.connect("student/student@xe") print strVersionOracle.formatVersion(db.version) |
Line 3 prints the result by calling the formatVersion function inside the strVersionOracle module. It prints the following:
11gR2 (11.2.0.2.0) |
You can test the program outside of the runtime environment with the following oracleConnection.py
file. It runs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # Import the Oracle library. import cx_Oracle import strVersionOracle try: # Create a connection. db = cx_Oracle.connect("student/student@xe") # Print a message. print "Connected to the Oracle " + strVersionOracle.formatVersion(db.version) + " database." except cx_Oracle.DatabaseError, e: error, = e.args print >> sys.stderr, "Oracle-Error-Code:", error.code print >> sys.stderr, "Oracle-Error-Message:", error.message finally: # Close connection. db.close() |
You can call the formatVersion()
function rather than a combination of module and function names when you write a more qualified import statement on line 3, like:
3 | from strVersionOracle import formatVersion |
Then, you can call the formatVersion()
function like this on line 10:
10 | print "Connected to the Oracle " + formatVersion(db.version) + " database." |
It works because you told it to import a function from a Python module. The first example imports a module that may contain one to many functions, and that style requires you to qualify the location of functions inside imported modules.
The oracleConnection.py
program works when you call it from the Bash shell provided you do so from the same directory where the oracleConnection.py
and strVersionOracle.py
files (or Python modules) are located. If you call the oracleConnection.py
file from a different directory, the reference to the library raises the following error:
Traceback (most recent call last): File "oracleConnection.py", line 3, in <module> import strVersionOracle ImportError: No module named strVersionOracle |
You can fix this error by adding the directory where the strVersionOracle.py file exists, like
export set PYTHONPATH=/home/student/Code/python |
Then, you can call successfully the oracleConnection.py
file from any directory:
python oracleConnection.py |
The program will connect to the Oracle database as the student user, and print the following message to the console:
Connected to the Oracle 11gR2 (11.2.0.2.0) database. |
I hope this helps those trying to create and use Python modules.
Python for loops
It’s always interesting to explain a new programming language to students. Python does presents some challenges to that learning process. I think for-loops can be a bit of a challenge until you understand them. Many students are most familiar with the traditional for loop like Java:
for (i = 0; i < 5; i++) { ... } |
Python supports three types of for-loops – a range for loop, a for-each expression, and a for-loop with enumeration. Below are examples of each of these loops.
- A range for-loop goes from a low numerical value to a high numerical value, like:
for i in range(0,3): print i |
It prints the following range values:
0 1 2 |
- A for-each loop goes from the first to the last item while ignoring indexes, like:
list = ['a','b','c'] for i in list: print i |
It prints the following elements of the list:
a b c |
- A for-loop with enumeration goes from the first to the last item while ignoring indexes, like:
list = ['a','b','c'] for i, e in enumerate(list): print "[" + str(i) + "][" + list[i] + "]" |
The i
represents the index values and the e
represents the elements of a list. The str()
function casts the numeric value to a string.
It prints the following:
[0][a] [1][b] [2][c] |
This should help my students and I hope it helps you if you’re trying to sort out how to use for loops in Python.