13. virtualenv&图形界面

virtualenv&图形界面

virtualenv

在开发Python应用程序的时候,系统安装的Python只有一个3.5版本。所有的第三方包都会被安装到Python3的site-packages目录下。

如果要同时开发多个应用程序,那么这些应用程序共用一个Python3.5,如果应用A需要jinja2.7,应用B需要jinja2.6,这时候需要用virtualenv来为一个应用创建一套隔离的Python运行环境。

第一步,创建项目文件夹myproject,在该文件夹中安装虚拟环境env:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
D:\笔记\Python\Notepad++>mkdir myproject
D:\笔记\Python\Notepad++>cd myproject
D:\笔记\Python\Notepad++\myproject>dir
驱动器 D 中的卷是 文件
卷的序列号是 0BE3-0E5C
D:\笔记\Python\Notepad++\myproject 的目录
2016/11/06 20:01 <DIR> .
2016/11/06 20:01 <DIR> ..
0 个文件 0 字节
2 个目录 104,178,057,216 可用字节
D:\笔记\Python\Notepad++\myproject>virtualenv env
Using base prefix 'c:\\users\\cdxu0\\appdata\\local\\programs\\python\\python35'
New python executable in D:\笔记\Python\Notepad++\myproject\env\Scripts\python.exe
Installing setuptools, pip, wheel...done.

第二步,启动虚拟环境,安装所需库类。在windows中虚拟环境的启动使用命令:your_env_dir\Scripts\activate,默认情况下,virtualenv已经安装好了pip。在启动虚拟环境后直接使用pip install命令就可以为该虚拟环境安装库类。

1
2
3
4
5
D:\笔记\Python\Notepad++\myproject>cd env\Scripts
D:\笔记\Python\Notepad++\myproject\env\Scripts>activate
(env) D:\笔记\Python\Notepad++\myproject\env\Scripts>pip install flask==0.9

第三步,在虚拟环境中可以运行脚本等操作,离开虚拟环境,使用deactivate命令。


图形界面

Python支持多种图形界面的第三方库,比如:Tk,wxWidgets ,Qt,GTK等。但是Python自带的库是支持Tk的TKinter,使用Tkinter,无需安装任何包就可以直接使用。

使用TKinter十分简单,第一步导入TKinter包的所有内容:

1
>>> from tkinter import *

第二步从Frame派生一个Application类,这是所有Widget的父容器:

1
2
3
4
5
6
7
8
9
10
>>> class Application(Frame):
def __init__(self,master=None):
Frame.__init__(self,master)
self.pack()
self.createWidgets()
def createWidgets(self):
self.helloLabel=Label(self, text='Hello, world!')
self.helloLabel.pack()
self.quitButton=Button(self, text='Quit', command=self.quit)
self.quitButton.pack()

在GUI中,每个Button、Label、输入框等,都是一个Widget。Frame则是可以容纳其他Widget的Widget,所有的Widget组合起来就是一棵树。

pack()方法把Widget加入到父容器中,并实现布局。pack()是最简单的布局,grid()可以实现更复杂的布局。

createWidgets()方法中,我们创建一个Label和一个Button,当Button被点击时,触发self.quit()使得程序退出。

第三步,实例化Application,并启动消息循环:

1
2
3
4
>>> app=Application()
>>> app.master.title('Hello world!')
''
>>> app.mainloop()

GUI程序的主线负责监听来自操作系统的消息,并依次处理每一条消息。因此,如果消息处理非常耗时,就需要新线程中处理。运行这个GUI程序:
Alt text

点击Quit按钮或者窗口的x结束程序。

输入文本

我们再对这个GUI程序改进一下,加入一个文本框,让用户可以输入文本,然后点按钮后,弹出消息对话框。

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
#!/usr/bin/env python3
#-*- coding: utf-8 -*-
from tkinter import *
import tkinter.messagebox as messagebox
class Application(Frame):
def __init__(self,master=None):
Frame.__init__(self,master)
self.pack()
self.createWidgets()
def createWidgets(self):
self.nameInput=Entry(self)
self.nameInput.pack()
self.alterButton=Button(self, text='Hello', command=self.hello)
self.alterButton.pack()
def hello(self):
name=self.nameInput.get() or 'world'
messagebox.showinfo('Message','Hello, %s' %name)
app=Application()
app.master.title('Hello World')
app.mainloop()

当用户点击按钮时,出发hello(),通过self.nameInput.get()获得用户输入的文本后,使用tkMessageBox.showinfo()可以弹出消息对话框:
Alt text
Alt text

Donate comment here