??xml version="1.0" encoding="utf-8" standalone="yes"?>91精品1区2区,欧美国产另类,欧美视频二区36phttp://www.aygfsteel.com/glorywine/category/32060.htmlzh-cnTue, 16 Sep 2008 17:23:39 GMTTue, 16 Sep 2008 17:23:39 GMT60Django on Jythonhttp://www.aygfsteel.com/glorywine/archive/2008/09/17/229275.htmlglorywineglorywineTue, 16 Sep 2008 16:41:00 GMThttp://www.aygfsteel.com/glorywine/archive/2008/09/17/229275.htmlhttp://www.aygfsteel.com/glorywine/comments/229275.htmlhttp://www.aygfsteel.com/glorywine/archive/2008/09/17/229275.html#Feedback0http://www.aygfsteel.com/glorywine/comments/commentRss/229275.htmlhttp://www.aygfsteel.com/glorywine/services/trackbacks/229275.html   使用Django已经一D|间了Q非常喜Ƣ这L状态,很少的配|文件和代码Q就可以样一个原型跑h?.0已经发布一D|间了Q有了很多的改变Q改q,很吸引眼球。但是还有一个特性非常吸引我QDjango可以q行在Jython上了Q这意味着Q可以在Tomcat,Glassfish{服务器上跑Django了,EXCITING?

   OK, Let's give a shot!
   1. of course, 先要现在Django
Q?font size="2" face="Courier New">不过我还是推荐用svn中的代码?div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;">svn co http://code.djangoproject.com/svn/django/trunk/ django-dev   2. 接着p下蝲Jython了,当前的stable版本?.2.1Q而我们需要的?.5Q该版本q是alpha阶段Q所以,q是从svn中获取?br />
svn co https://jython.svn.sourceforge.net/svnroot/jython/trunk/jython/ jython-dev
   完成了Jython的检出,开始编译工作。需要指出的是,我们在这里用ant来构建JythonQ当Ӟ也可以选择mavenQ看个h习惯了,ant和maven的具体安装方法大家可以去googleQ这里不再篏q?br />
cd jython-dev
ant
   E等片刻Q就可以完成~译工作了,生成的文件在jython-dev下的dist文g夹下。然后,我将dist下的文g全部拯到D:/jython下,我在q里使用的是windowsQ大家可以根据自qq_q行讄?br />   Z能在console里用JythonQ我们还需要将jython目录下的bin文gҎ加到path。这里大家也可以去googleQ不再多说。现在打开一个consoleQ输入jythonQ是不是能看到非常熟悉的Qpython控制台呢Q?br />   3. 好的Q现在就需要安装Django了?br />
cd django-dev
jython setup.py build
jython setup.py install
   安装完成后,可以在jython/Lib/site-packages下看到Django了。ؓ了查看是否安装成功,使用下面的方法。打开控制収ͼ
D:\>jython
Jython 
2.5a3+ (trunk, ???? 16 200818:50:22)
[Java HotSpot(TM) Client VM (Sun Microsystems Inc.)] on java1.
6.0_10-beta
Type 
"help""copyright""credits" or "license" for more information.
>>> import django
>>> django.get_version()
u
'1.0-post-release-SVN-SVN-unknown'
   如果看到了最后的输出pC安装成功了?br />   4. 当前Django on Jython只支持postgresqlQ所以,我们q里q需要下载一个LibQDjango-Jython.
svn co http://django-jython.googlecode.com/svn/trunk/ django-jython
cd django-jython
jython setup.py build
jython setup.py install
   q样完成了django-jython的安装?br />   5. 最后就是安装postgresql数据库了Q大家可以根据官方的文档q行安装?br />
   万事俱备Q让我们开始真正的Django on Jython之旅吧?br />   q里q需要说明一点,在完成Django的安装之后,在jython/bin下会有一个django-admin.pyQ这个是Django命o的工PZ同CPython下的Djangoq行区别Q我在这里将光命名为django-admin-jy.py?br />   好,切换到工作目录?br />
django-admin-jy.py startproject djangonjython
   是不是有djangonjythonq个目录出现呢?对了Q这是我们创徏的工E?br />   如果你是一个急性子Q那么就让我们尝试一下,看看是不是能够运行呢Q?br />
cd djangonjython
jython manage.py runserver
   熟悉的页面是否出现呢Q?br />
runserver.PNG
   在观察一下djangonjython目录里的文gQ哈Q没有了.pycQ改成了.classQ确实是jython在工作了?br />   如果只是q行q么一个东西,肯定没有什么hg。OKQlet's build an application。我们在q里创徏一个简单的blogQ老生常谈?)Q?br />
jython manage.py startapp blog
   q样完成了app的创建,当然在djangonjython下应该多了一个blog文g夹,里面q包含了一些文件?br />   首先修改models.pyQ内容如下:
 1 from django.db import models
 2 from django.contrib.auth.models import User
 3 
 4 class Entry(models.Model):
 5     STATUS_CHOICES = (
 6         (0, 'live'),
 7         (1'draft'),
 8         (2'cancel'),
 9     )
10     author = models.ForeignKey(User)
11     title = models.CharField(max_length=255)
12     slug = models.SlugField()
13     content = models.TextField()
14     create_at = models.DateTimeField(auto_now_add=True)
15     status = models.IntegerField(default=0, choices=STATUS_CHOICES)
16     
17     def __unicode__(self):
18         return self.title
19         
20     def get_absolute_url(self):
21         return '/blog/%s' % (self.slug)
22         
23     class Meta:
24         ordering = ['-create_at']
   q只是一个非常简单的原型Q说明问题就行了。好Q既然用了Django 1.0那么p有一些改变,现在的Django使用了newform-adminQ那么就在blog目录下创建admin.py文gQ内容如下:
 1 from django.contrib import admin
 2 
 3 from djangonjython.blog.models import Entry
 4 
 5 class EntryAdmin(admin.ModelAdmin):
 6     list_display = ('title''author''create_at''status',)
 7     ordering = ['-create_at']
 8     list_filter = ('author''status',)
 9     prepopulated_fields = {'slug': ('title',),}
10     
11 admin.site.register(Entry, EntryAdmin)
   q样将Entry注册Cadmin site里,可以在admin page里进行管理了?br />   再进一步之前,先启动先前安装的postgresqlQ创建database blog。完成之后,p寚w目进行一些配|了?br />   首先是djangonjython目录下的urls.py
   取消q几行的注释Q?div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;">from django.contrib import admin
admin.autodiscover()

(r
'^admin/(.*)', admin.site.root),
   为的是能够访问到admin page.
   接着是settings.pyQ?div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;">DATABASE_ENGINE = 'doj.backends.zxjdbc.postgresql'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
DATABASE_NAME = 'blog'             # Or path to database file if using sqlite3.
DATABASE_USER = 'yourname'             # Not used with sqlite3.
DATABASE_PASSWORD = 'yourpassword'         # Not used with sqlite3.
DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.admin',
    'djangonjython.blog',
    'doj',
)


   对上面的代买q行一些说明:
   doj.backends.zxjdbc.postgresql是之前安装的django-jython提供的数据支持,当然Q要使用q个Q必ddojq个库添加到PYTHONPATH中,所以在下面的INSTALLED_APPS里,加入了dojQ而djangonjyton.blog是之前创徏的app?br />   好,完成了这些,可以开始数据库的创Z。熟悉的命oQ?br />
jython manage.py syncdb
   按照上面的提C,一步一步的q行填写。完成之后,启动服务Q是不是又是一个熟悉的画面Q?br />
   填写之前要求的管理员用户名和密码Q就q入Cadmin pageQ我习惯U后台管理页面?/font>
   好了Q在q里可以添加一些entry了。完成了后台的管理,让我们添加一些前台的昄吧?/font>
   在这里,我打用django自带的generic viewsQ用v来非常的单。ؓ了同目的urls.py区别开Q在blog下创Z个新的urls.pyQ内容如下:
 1 from django.conf.urls.defaults import *
 2 
 3 from djangonjython.blog.models import Entry
 4 
 5 entry_dict = {
 6     'queryset': Entry.objects.all(),
 7     'template_object_name''entry',
 8 }
 9 
10 urlpatterns = patterns('django.views.generic.list_detail',
11     (r'^blog/$''object_list', entry_dict),
12     (r'^blog/(?P<slug>.*)/$''object_detail', entry_dict),
13 )
14 
   然后p修改目目录下的urls.py了,?r'^admin/(.*)', admin.site.root)之前dQ?br />
(r'', include('djangonjython.blog.urls')),
   接着pd模板文g了,在blog目录下创建templates/blogq样的目录,然后再里面添加entry_list.html和entry_detail.html两个文gQ内容分别如下:
entry_list.html
1 {% if entry_list %}
2     {% for entry in entry_list %}
3         <href="/blog/{{ entry.slug }}"><h3>{{ entry.title }}</h3></a> Post at: {{ entry.create_at|date:"Y-b-d" }}<hr/>
4     {% endfor %}
5 {% endif %}
entry_detail.html
1 {% if entry %}
2     <span style="color: green;">{{ entry.title }}</span><br/><br/>
3     post by: <b>{{ entry.author.username }}</b><br/><br/>
4     <div style="color: blue">{{ entry.content|safe }}</div>
5 {% endif %}
   完成了这些之后,p告诉djangoQ怎么处理了,也就是要修改settings.py了:
import os
PROJECT_ROOT 
= os.path.abspath(__file__)
TEMPLATE_DIRS 
= (
    os.path.join(PROJECT_ROOT, 
'blog/templates'),
)
   d前面两句Q修改后面的TEMPLATE_DIRSQ告诉django到哪里去找模板文件?br />   重新启动服务器,输入http://localhost:8000/blog/Q就可以看到一个简单的blog列表了,如果有的话。点ȝ应的标题Q就会进入到具体的entry了?br />   到这里位|,一个简单的blogq是创建好了。我们的目的主要是要看他在其他的服务器上是否能够q行Q好的,q里pq行打包处理了?br />   django-jython提供了一个war命oQ会我们的工程打包成war包,方便部v。不qdjango-jython有一个小的bug。找到jython/Lib/site-packages/doj/manamgement/commands/war.pyQ在该文件的W?28行,原来是:
if dest_relative_path[-1== '/':
   现在我们要将其改为:
if dest_relative_path[-1== os.path.sep:
   因ؓ在windows下得到的?\\'而不?/'Q所以执行的时候会出错Q可能开发者没有在windows下进行测试,所以出Cq样的情c?br />   接着Q我们需要链接postgresql的jdbc包,大家可以在这里下?a >postgres-jdbc。下载后Q将其放在项目目录下Q开始打包:
jython manage.py war --include-java-libs=./postgresql-8.3-603.jdbc4.jar
   q一D|_可以在目的上一U目录看到djangonjython.war
   到这里,javaE序员就可以使用熟悉的java web serverq行部v了!部v完成后,输入http://localhost:8080/djangonjython/blog/可以进行访问了?br />   q里l出一些在tomcat上运行的截图Q?br />
admin_page.PNG
backend.PNG
   怎么P感觉q是不错吧?br />   其实QDjango on Jythonq有很长的\要走Q要支持更多的主数据库Q以及运行效率等问题。不q还是非常期待,希望能够快速的发展Q毕竟Django的开发效率要q远高于Java。So let's look forward to it!






glorywine 2008-09-17 00:41 发表评论
]]>
Django Docshttp://www.aygfsteel.com/glorywine/archive/2008/08/24/223987.htmlglorywineglorywineSun, 24 Aug 2008 07:17:00 GMThttp://www.aygfsteel.com/glorywine/archive/2008/08/24/223987.htmlhttp://www.aygfsteel.com/glorywine/comments/223987.htmlhttp://www.aygfsteel.com/glorywine/archive/2008/08/24/223987.html#Feedback0http://www.aygfsteel.com/glorywine/comments/commentRss/223987.htmlhttp://www.aygfsteel.com/glorywine/services/trackbacks/223987.html       其实, 在django的svn repository? 有相应的docs, 不过是txt格式? 如果览q个, 当然会非常的别扭.
       今天看到, django对docsq行了重? 现在大家可以这些文件下载到本地, 然后q行~译, 生成相应的文? 览h会非常方? 舒服.

       ? 我们单的看一看该如何操作:
1. 从svn库中checkout:
svn co http://code.djangoproject.com/svn/django/trunk/docs/ django_docs
       q样, 在当前目录下׃有了django_docs? q去看一? ? 重构后结构果然清晰多?  q去是一股脑所有的文g攑֜一? 现在是分门别c? 不错.

2. 安装Sphinx:
easy_install Sphinx
        当然前提是python中已l安装了easy_install, 如果没有, 大家google一? 非常Ҏ.
        熟悉python的朋友应该知? Sphinx是非常好的一个工? 可以简单文本格式{换ؓhtml格式, 当然, 文本内容需要按照Sphinx的语法进行编? Python现在的在Udocuments是使用Sphinxq行~译?感兴的朋友可以?a >Sphinx了解更多内容.

3. ~译:
make html
        q里make提供了很多种格式, 因ؓ我们只需要html, 所以加上这个选项p?
        到这? 完成了django_docs的编译工? 在django_docs/_build/html下就是编译的l果. 重构后的文档的css也有了新的变? 现在的非常像django_book的样?
        OK, 以后我们可以在本地q行文档的阅M, 怿会给开发带来事半功倍的效果.
       
        q里我附上一份我~译好的, 供大家下? django_docs


glorywine 2008-08-24 15:17 发表评论
]]>
PyQt4 - (4) 布局理http://www.aygfsteel.com/glorywine/archive/2008/07/30/217842.htmlglorywineglorywineWed, 30 Jul 2008 07:39:00 GMThttp://www.aygfsteel.com/glorywine/archive/2008/07/30/217842.htmlhttp://www.aygfsteel.com/glorywine/comments/217842.htmlhttp://www.aygfsteel.com/glorywine/archive/2008/07/30/217842.html#Feedback0http://www.aygfsteel.com/glorywine/comments/commentRss/217842.htmlhttp://www.aygfsteel.com/glorywine/services/trackbacks/217842.html PyQt4中的布局理

布局是GUIE序开发中非常重要的一个环? 而布局理是要规划如何在H口中放|需要的部g. PyQt4中就有两U方法来完成布局d,一个是l对位置(absolute positioning), 另一个就是用布局c?layout classes).

l对位置(absolute positioning)
q种Ҏ需要程序员在程序中指定每个部g的坐标位|和大小. 在这里有几个注意事项.
  • 指定了坐标和大小的部件是不能够随着H口大小的变化而变化的.
  • E序在不同的操作pȝq_上也怼有所变化.
  • 改变字体可能会引起布局的؜?
  • 如果需要改变当前的布局, 需要重新编? q意味着非常大的工作?
 1 #!/usr/bin/python
 2 
 3 # absolute.py
 4 
 5 import sys
 6 from PyQt4 import QtGui
 7 
 8 class Absolute(QtGui.QWidget):
 9     def __init__(self, parent=None):
10         QtGui.QWidget.__init__(self, parent)
11         
12         self.setWindowTitle('Communication')
13         
14         label = QtGui.QLabel('Could\'t', self)
15         label.move(1510)
16 
17         label = QtGui.QLabel('care', self)
18         label.move(3540)
19 
20         label = QtGui.QLabel('less', self)
21         label.move(5565)
22 
23         label = QtGui.QLabel('And', self)
24         label.move(11565)
25 
26         label = QtGui.QLabel('then', self)
27         label.move(13545)
28 
29         label = QtGui.QLabel('you', self)
30         label.move(11525)
31 
32         label = QtGui.QLabel('kissed', self)
33         label.move(14510)
34 
35         label = QtGui.QLabel('me', self)
36         label.move(21510)
37 
38         self.resize(250150)
39 
40 app = QtGui.QApplication(sys.argv)
41 qb = Absolute()
42 qb.show()
43 sys.exit(app.exec_())

在这? 是单的调用move()Ҏ来指定部件的攄坐标. 坐标的顶点就在窗口的左上? x由左向右不断增大, y׃C不断增大.
Communication.png
Figure: absolute positioning

Box Layout

使用布局c进行布局理是一仉常轻杄事情.  最基本的布局cd是QHboxLayout和VHBoxLayout. 他们部件线性的水^或垂直排?
q里假设我们要将两个按钮攑֜H口的右下方, 要实现这L布局, 使用一个QHBoxLayout和一个QVBoxLayout, 而其他的I间, 通过dstretch factor来实?

 1 #!/usr/bin/python
 2 
 3 # boxlayout.py
 4 
 5 import sys
 6 from PyQt4 import QtGui
 7 
 8 class BoxLayout (QtGui.QWidget):
 9     def __init__(self, parent=None):
10         QtGui.QWidget.__init__(self, parent)
11         
12         self.setWindowTitle('boxlayout')
13         
14         ok = QtGui.QPushButton('OK')
15         cancel = QtGui.QPushButton('Cancel')
16 
17         hbox = QtGui.QHBoxLayout()
18         hbox.addStretch(1)
19         hbox.addWidget(ok)
20         hbox.addWidget(cancel)
21 
22         vbox = QtGui.QVBoxLayout()
23         vbox.addStretch(1)
24         vbox.addLayout(hbox)
25 
26         self.setLayout(vbox)
27         
28         self.resize(300150)
29 
30 app = QtGui.QApplication(sys.argv)
31 qb = BoxLayout()
32 qb.show()
33 sys.exit(app.exec_())

ok  =  QtGui.QPushButton( ' OK ' )
cancel 
=  QtGui.QPushButton( ' Cancel ' )
创徏两个按钮

hbox  =  QtGui.QHBoxLayout()
hbox.addStretch(
1 )
hbox.addWidget(ok)
hbox.addWidget(cancel)
创徏一个水q的box layout. 然后dstretch factor和两个按?
vbox  =  QtGui.QVBoxLayout()
vbox.addStretch(
1 )
vbox.addLayout(hbox)
创徏最后的布局c? 水q的布局cL入到垂直的布局cd?
self.setLayout(vbox)
最? 窗口的布局讑֮为垂直布局.
boxlayout-1.png
Figure: box layout

QGridLayout

最常用的布局cd当是QGridLayout, 他将H口分成不同的行和列.
 1 #!/usr/bin/python
 2 
 3 # gridlayout.py
 4 
 5 import sys
 6 from PyQt4 import QtGui
 7 
 8 class GridLayout(QtGui.QWidget):
 9     def __init__(self, parent=None):
10         QtGui.QWidget.__init__(self, parent)
11 
12         self.setWindowTitle('grid layout')
13 
14         names = ['Cls''Bck''''Close''7''8''9''/',
15                  '4''5''6''*''1''2''3''-',
16                  '0''.''=''+']
17         
18         grid = QtGui.QGridLayout()
19         
20         j = 0
21         pos = [
22             (0, 0), (0, 1), (0, 2), (0, 3),
23             (1, 0), (11), (12), (13),
24             (2, 0), (21), (22), (23),
25             (3, 0), (31), (32), (33),
26             (4, 0), (41), (42), (43)
27             ]
28         
29         for i in names:
30             button = QtGui.QPushButton(i)
31             if j == 2:
32                 grid.addWidget(QtGui.QLabel(''), 0, 2)
33             else:
34                 grid.addWidget(button, pos[j][0], pos[j][1])
35             j = j + 1
36         
37         self.setLayout(grid)
38 
39 app = QtGui.QApplication(sys.argv)
40 qb = GridLayout()
41 qb.show()
42 sys.exit(app.exec_())
在这个例子中, 创徏了很多按? 用来填充相应的grid.
grid  =  QtGui.QGridLayout()
q一句就创徏了grid layout.
if  j  ==   2 :
    grid 
=  addWidget(QtGui.QLabel( '' ), 0,  2 )
else :
    grid 
=  addWidget(button, pos[j][0], pos[j][i])
把部件放入grid, 调用addWidget()Ҏp? 参数是要放入的部g以及相应的行数和列数.
grid layout.png
Figure: grid layout

需要说明一? 部g也可以多行和多列. 下面的列子就演示了之一?
 1 #!/usr/bin/python
 2 
 3 # gridlayout2.py
 4 
 5 import sys
 6 from PyQt4 import QtGui
 7 
 8 class GridLayout2(QtGui.QWidget):
 9     def __init__(self, parent=None):
10         QtGui.QWidget.__init__(self, parent)
11 
12         self.setWindowTitle('grid layout2')
13 
14         title = QtGui.QLabel('Title')
15         author = QtGui.QLabel('Author')
16         review = QtGui.QLabel('Review')
17         
18         titleEdit = QtGui.QLineEdit()
19         authorEdit = QtGui.QLineEdit()
20         reviewEdit = QtGui.QTextEdit()
21 
22         grid = QtGui.QGridLayout()
23         grid.setSpacing(10)
24 
25         grid.addWidget(title, 1, 0)
26         grid.addWidget(titleEdit, 11)
27 
28         grid.addWidget(author, 2, 0)
29         grid.addWidget(authorEdit, 21)
30 
31         grid.addWidget(review, 3, 0)
32         grid.addWidget(reviewEdit, 3151)
33 
34         self.setLayout(grid)
35         self.resize(350300)
36 
37 app = QtGui.QApplication(sys.argv)
38 qb = GridLayout2()
39 qb.show()
40 sys.exit(app.exec_())
41 

grid  =  QtGui.QGridLayout()
grid.setSpacing(
10 )
创徏布局c? q设定部件之间的距离?0个像?
grid.addWidget(reviewEdit,  3 1 5 , , 1 )
l布局中添加部件时, 可以指定占据的行数和占据的列? q个例子? 我们让reviewEdit占据??
grid layout2.png
Figure: grid layout 2






glorywine 2008-07-30 15:39 发表评论
]]>
PyQt4 - (3) 菜单和工hhttp://www.aygfsteel.com/glorywine/archive/2008/07/26/206731.htmlglorywineglorywineSat, 26 Jul 2008 04:08:00 GMThttp://www.aygfsteel.com/glorywine/archive/2008/07/26/206731.htmlhttp://www.aygfsteel.com/glorywine/comments/206731.htmlhttp://www.aygfsteel.com/glorywine/archive/2008/07/26/206731.html#Feedback5http://www.aygfsteel.com/glorywine/comments/commentRss/206731.htmlhttp://www.aygfsteel.com/glorywine/services/trackbacks/206731.html ȝ?/strong>

QMainWindowcȝ我们提供了一个程序主H口Q得我们能够创Z个标准的E序框架Q包括了状态栏Q工h和菜单栏?br />
状态栏(Statusbar)
状态栏是一U用来显C状态信息的部?
 1 #!/usr/bin/python
 2 
 3 # statusbar.py
 4 
 5 import sys
 6 from PyQt4 import QtGui
 7 
 8 class MainWindow(QtGui.QMainWindow):
 9     def __init__(self):
10         QtGui.QMainWindow.__init__(self)
11 
12         self.resize(250150)
13         self.setWindowTitle('statusbar')
14         
15         self.statusBar().showMessage('Ready')
16 
17 app = QtGui.QApplication(sys.argv)
18 main = MainWindow()
19 main.show()
20 sys.exit(app.exec_())
21 

self.statusBar().showMessage( ' Ready ' )
q里需要注意的是q一?通过调用QMainWindowcȝstatusBar()Ҏ,得到statusbar的句?然后调用showMessage()昄信息在statusbar?非常Ҏ?

菜单?Menubar)
菜单是应用程序中最常见的一U组?通常每个菜单都是完成不同的Q?
 1 #!/usr/bin/python
 2 
 3 # menubar.py
 4 
 5 import sys
 6 from PyQt4 import QtGui, QtCore
 7 
 8 class MainWindow(QtGui.QMainWindow):
 9     def __init__(self):
10         QtGui.QMainWindow.__init__(self)
11         
12         self.resize(250150)
13         self.setWindowTitle('menubar')
14         
15         exit = QtGui.QAction(QtGui.QIcon('icons/web.png'), 'Exit', self)
16         exit.setShortcut('Ctrl+Q')
17         exit.setStatusTip('Exit application')
18         self.connect(exit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()'))
19         
20         self.statusBar()
21 
22         menubar = self.menuBar()
23         file = menubar.addMenu('&File')
24         file.addAction(exit)
25 
26 app = QtGui.QApplication(sys.argv)
27 main = MainWindow()
28 main.show()
29 sys.exit(app.exec_())
30 

menubar  =  self.menuBar()
file 
=  menubar.addMenu( ' &File ' )
file.addAction(exit)
首先调用self.menuBar()创徏菜单?接着调用addMenu()d一个菜?最后给菜单d一个动?是q里的exit.

工具?Toolbar)
菜单可以不同的命o按组分类,然?有些常用的命令就可以通过工具栏来攄,q样更便于?
 1 #!/usr/bin/python
 2 
 3 # toolbar.py
 4 
 5 import sys
 6 from PyQt4 import QtGui, QtCore
 7 
 8 class MainWindow(QtGui.QMainWindow):
 9     def __init__(self):
10         QtGui.QMainWindow.__init__(self)
11         
12         self.resize(250150)
13         self.setWindowTitle('toolbar')
14         
15         self.exit = QtGui.QAction(QtGui.QIcon('icons/web.png'), 'Exit', self)
16         self.exit.setShortcut('Ctrl+Q')
17         self.connect(self.exit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()'))
18 
19         self.toolbar = self.addToolBar('Exit')
20         self.toolbar.addAction(self.exit)
21 
22 app = QtGui.QApplication(sys.argv)
23 main = MainWindow()
24 main.show()
25 sys.exit(app.exec_())

self.exit  =  QtGui.QAction(QtGui.QIcon( ' icons/web.png ' ),  ' Exit ' , self)
self.exit.setShortcut(
' Ctrl+Q ' )
GUIE序是通过命o来控制的, 而这些命令可以由菜单,上下文菜?工具栏或者快捷键来发?  PyQt命令抽象ؓactions. 一个action对象可以有text, 图标, 快捷? 状态栏描述, "What's This?"描述和tooltip. 上面的例?定义了icon, tooltip和shortcut.
self.connect(self.exit, QtCore.SIGNAL( ' triggered() ' ), QtCore.SLOT( ' close() ' ))
q一?action的triggered()信号和预先定义的close()槽结合到一?
self.toolbar  =  self.addToolBar( ' Exit ' )
self.toolbar.addAction(self.exit)
然后将定义好的action攑օtoolbar可以了.
toolbar.png
Figure: toolbar

一个完整的E序

最后这个部?menubar, toolbar和statusbar攑֜一?
 1 #!/usr/bin/python
 2 
 3 # mainwindow.py
 4 
 5 import sys
 6 from PyQt4 import QtGui, QtCore
 7 
 8 class MainWindow(QtGui.QMainWindow):
 9     def __init__(self):
10         QtGui.QMainWindow.__init__(self)
11 
12         self.resize(350250)
13         self.setWindowTitle('mainwindow')
14         
15         textEdit = QtGui.QTextEdit()
16         self.setCentralWidget(textEdit)
17 
18         exit = QtGui.QAction(QtGui.QIcon('icons/web.png'), 'Exit', self)
19         exit.setShortcut('Ctrl+Q')
20         exit.setStatusTip('Exit application')
21         self.connect(exit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()'))
22         
23         self.statusBar()
24         
25         menubar = self.menuBar()
26         file = menubar.addMenu('&File')
27         file.addAction(exit)
28         
29         toolbar = self.addToolBar('Exit')
30         toolbar.addAction(exit)
31 
32 app = QtGui.QApplication(sys.argv)
33 main = MainWindow()
34 main.show()
35 sys.exit(app.exec_())
36 

textEdit  =  QtGui.QTextEdit()
self.setCentralWidget(textEdit)
q里创徏了一个edit部g,q将其设|ؓQMainWindow的中央部?中央部g是说要占据初菜?工具?状态栏之外的所有空?






glorywine 2008-07-26 12:08 发表评论
]]>
PyQt4 - (2) W一印象http://www.aygfsteel.com/glorywine/archive/2008/06/21/206729.htmlglorywineglorywineSat, 21 Jun 2008 15:58:00 GMThttp://www.aygfsteel.com/glorywine/archive/2008/06/21/206729.htmlhttp://www.aygfsteel.com/glorywine/comments/206729.htmlhttp://www.aygfsteel.com/glorywine/archive/2008/06/21/206729.html#Feedback0http://www.aygfsteel.com/glorywine/comments/commentRss/206729.htmlhttp://www.aygfsteel.com/glorywine/services/trackbacks/206729.html在这个部分,我们开始学习一些PyQt4的基本功能,解释会比较详l,像教孩子说话一栗?br />
最单的example

    下面的示例会非常的简单,仅仅昄一个小H口Q但是将来我们可以通过q个窗口做很多事情。我们可以对它进行羃放,最大化Q最化。而这些就需要比较多的代码了。但是开发h员已l帮我们完成了这些功能,因ؓq些功能在大多场合都会用到Q所以没有必要让我们重复。PyQt是一个高U别的工具库Q如果用别相对较低的库开发下面的功能Q就非常可能需要更多的代码了?br />
 1#!/usr/bin/python
 2
 3# simple.py
 4
 5import sys
 6from PyQt4 import QtGui
 7
 8app = QtGui.QApplication(sys.argv)
 9
10widget = QtGui.QWidget()
11widget.resize(250150)
12widget.setWindowTitle('simple')
13widget.show()
14
15sys.exit(app.exec_())

    下面对代码进行分?br />
import sys
from PyQt4 import QtGui
     q里Q我们导入了必要的模块,PyQt4的基本模块都在QtGui中?br />
app = QtGui.QApplication(sys.argv)
     每一个PyQt4E序都必dZ个application对象QapplicationcM于QtGui模块中。sys.argv传入命o行参数。Python脚本可以通过shellq行Q这h们就可以对程序的启动q行控制?br />
widget = QtGui.QWidget()
     QWidget是PyQt4中所有用h口对象的基类Q我们用QWidget默认的构造方法来创徏QWidget对象Q默认的构造方法没有指定父控gQ如果一个widget没有指定父控Ӟ那么我们q他ؓ一个window?br />
widget.resize(250150)
    resize()Ҏ调整widget的大,在这里我们设定宽度ؓ250pxQ高度ؓ150px?/font>
widget.setWindowTitle('simple')
    setWindowTitle()Ҏ讄了窗口的titleQtitle在titlebar中显C?/font>
widget.show()
    调用show()Ҏ窗口显C出来?/font>
sys.exit(app.exec_())
    最后,׃q入application的事件@环。事件处理就从这里开始,循环不断的从H口接受需要处理的事gQ然后将其分发给相应的时间处理方法。通过调用exit()Ҏ或者销毁widget来终止事件@环,调用sys.exit()Ҏ保了程序可以明的退出,也就是程序退出后会告知系l?br />也许你会问,Z么exec_()Ҏ最后会有一个下划线Q问得非常好Q这完全是因为exec是python的一个关键字Q所以我们不得不使用exec_来代ѝ?br />Icon.png
?Qsimple

d图标

   应用E序的图标一般就是一个在E序标题栏左上角昄的小囄Q下面的例子我们展示如何使用PyQt4来显C图标,同时引入一些新的方法?/font>
 1 #!/usr/bin/python
 2 
 3 # icon.py
 4 
 5 import sys
 6 from PyQt4 import QtGui
 7 
 8 class Icon(QtGui.QWidget):
 9     def __init__(self, parent=None):
10         QtGui.QWidget.__init__(self, parent)
11 
12         self.setGeometry(300300250150)
13         self.setWindowTitle('Icon')
14         self.setWindowIcon(QtGui.QIcon('icons/web.png'))
15 
16 app = QtGui.QApplication(sys.argv)
17 icon = Icon()
18 icon.show()
19 sys.exit(app.exec_())
    E序使用的是cMC语言的过E式风格QPython同时支持q程式和面向对象式的~程风格。需要注意的是,在用PyQt4Ӟ意味着面向对象~程?/font>
class Icon(QtGui.QWidget):
    
def __init__(self, parent=None):
        QtGui.QWidget.
__init__(self, parent)
    面向对象~程中最重要的三个要素就是类(classes),数据(data)和方?methods)。首先我们徏立一个类叫做IconQ他从QtGui.QWidgetl承而来。这意味着Q我们必要两次调用构造方法,一个是IconcȝQ另一个是父类的?/font>
self.setGeometry(300300250150)
self.setWindowTitle(
'Icon')       self.setWindowIcon(QtGui.QIcon('icons/web.png'))
    上面三个Ҏ都是从父cȝ承而来Q即QtGui.QWidget。setGeometry()在这里做两g事情Q一是指定了H口在屏q中的位|,二就是指定了H口的大。前面两个参数是x和y坐标Q后面两个是H口的width和height。最后一个方法给H口指定了一个图标,我们需要首先创Z个QIcon对象Q而QIcon接受一个参数指明图标的路径?/font>
simple.png
?QIcon

展示信息提示(tooltip)

    我们可以使用PyQt4lQ何的部gd信息提示功能?/font>
 1 #!/usr/bin/python
 2 
 3 # tooltip.py
 4 
 5 import sys
 6 from PyQt4 import QtGui
 7 from PyQt4 import QtCore
 8 
 9 class Tooltip(QtGui.QWidget):
10     def __init__(self, parent=None):
11         QtGui.QWidget.__init__(self, parent)
12 
13         self.setGeometry(300300250150)
14         self.setWindowTitle('Tooltip')
15 
16         self.setToolTip('This is a <b>QWidget</b> widget')
17         QtGui.QToolTip.setFont(QtGui.QFont('OldEnglish'10))
18 
19 app = QtGui.QApplication(sys.argv)
20 tooltip = Tooltip()
21 tooltip.show()
22 app.exec_()
    在这个例子中Q我们给QWidget提供了信息提C?/font>
self.setToolTip('This is a <b>QWidget</b> widget')
    使用setTooltip()来创Z个tooltipQ值得高兴的是Q我们可以用富文本格式(rich text formatting)?/font>
QtGui.QToolTip.setFont(QtGui.QFont('Courier New'10))
    ׃QToolTip默认的字体看h很糟p,所以我们对之进行一些改q?/font>
Untitled.png
?QTooltip

关闭H口

    之前的例子中Q我们关闭程序都是用标题栏上的X按钮q行关闭的。下面的例子里,我们使用~程的方式来关闭H口。而在q里Q我们就要开始了解一些Qt中非帔R要的概念了,信号(signals)和槽(slots)?br />    下面一行是QPushButton的构造方法?/font>
QPushButton(string text, QWidget parent = None)
    参数text是在按钮上显C的文本Qparent是按钮的父容器?/font>
 1 #!/usr/bin/python
 2 
 3 # quitbutton.py
 4 
 5 import sys
 6 from PyQt4 import QtGui, QtCore
 7 
 8 class QuitButton(QtGui.QWidget):
 9     def __init__(self, parent=None):
10         QtGui.QWidget.__init__(self, parent)
11 
12         self.setGeometry(300300250150)
13         self.setWindowTitle('Icon')
14 
15         quit = QtGui.QPushButton('Close', self)
16         quit.setGeometry(10106035)
17 
18         self.connect(quit, QtCore.SIGNAL('clicked()'), \
19                      QtGui.qApp, QtCore.SLOT('quit()'))
20         
21 app = QtGui.QApplication(sys.argv)
22 qb = QuitButton()
23 qb.show()
24 sys.exit(app.exec_())

quit = QtGui.QPushButton('Close', self)
quit.setGeometry(
10106035)
     在QWidget上我们创Z一个按钮,像在屏q中创徏一个QWidget一栗?/font>
self.connect(quit, QtCore.SIGNAL('clicked()'), \
             QtGui.qApp, QtCore.SLOT(
'quit()'))
     正如前面所_PyQt4的事件处理时间里在信?signals)和槽(slots)机制上的。如果我们点M按钮Q就发射了信号clicked()Ҏ。槽可以是PyQt槽,也可以是Mpython中可调用的方法。通过使用QtCore.QObject.connect()Ҏ信号和槽链接v来。在我们的例子中Q用的槽是PyQt中预先定义的quit()槽。就好象sender和receiver一P在两个对象之间进行交。在上面的例子里Qsender是按钮Qreceiver是application对象?/font>
Picture 1.png
?Qquit button

对话?/font>


    默认情况下,如果我们点击了标题栏的X按钮Q就会将H口关闭Q而有些时候,需要修改这L行ؓ。比如说在文本编辑器中,如个要关闭一个正在修改的文gQ就会弹Z个对话框来确认?/font>
 1 #!/usr/bin/python
 2 
 3 # messagebox.py
 4 
 5 import sys
 6 from PyQt4 import QtGui
 7 
 8 class MessageBox(QtGui.QWidget):
 9     def __init__(self, parent=None):
10         QtGui.QWidget.__init__(self, parent)
11 
12         self.setGeometry(300300250150)
13         self.setWindowTitle('message box')
14 
15     def closeEvent(self, event):
16         reply = QtGui.QMessageBox.question(self, 'Message', \
17                                            'Are you sure to quit?',\
18                                            QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
19         if reply == QtGui.QMessageBox.Yes:
20             event.accept()
21         else:
22             event.ignore()
23             
24         
25 app = QtGui.QApplication(sys.argv)
26 mb = MessageBox()
27 mb.show()
28 sys.exit(app.exec_())
    如果要关闭QWidgetQQCloseEvent旉׃产生。要修改QWidget的默认行为,需要重载父cM的closeEvent()Ҏ?/font>
reply = QtGui.QMessageBox.question(self, 'Message', \
                                  
'Are you sure to quit?',\
                                           QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
    在这里,昄了两个按钮的对话框,Yes和No。第一个string参数出现在标题栏上,W二个string参数昄在对话框中。在reply中保存了q回倹{?/font>
if reply == QtGui.QMessageBox.Yes:
    event.accept()
else:
    event.ignore()
    对返回D行比较,如果点击了Yes按钮Q就接受事gQ关闭窗口,相反忽略事件?/font>
Picture 2.png
?Qmessage box

H口居中

    下面的代码展CZ如何创建的H口在屏q中居中?/font>
 1 #!/usr/bin/python
 2 
 3 # center.py
 4 
 5 import sys
 6 from PyQt4 import QtGui
 7 
 8 class Center(QtGui.QWidget):
 9     def __init__(self, parent=None):
10         QtGui.QWidget.__init__(self, parent)
11         
12         self.setWindowTitle('center')
13         self.resize(250150)
14         self.center()
15 
16     def center(self):
17         screen = QtGui.QDesktopWidget().screenGeometry()
18         size = self.geometry()
19         self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2)
20             
21         
22 app = QtGui.QApplication(sys.argv)
23 = Center()
24 c.show()
25 sys.exit(app.exec_())

self.resize(250150)
    窗口大调整ؓ?50pxQ高150px?/font>
screen = QtGui.QDesktopWidget().screenGeometry()
    获得昄器的分L率?/font>
size = self.geometry()
    获得QWidget的大?/font>
self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2)
    窗口移动到屏幕中央?/font>


glorywine 2008-06-21 23:58 发表评论
]]>PyQt4 - (1) PyQt4?/title><link>http://www.aygfsteel.com/glorywine/archive/2008/06/08/206726.html</link><dc:creator>glorywine</dc:creator><author>glorywine</author><pubDate>Sun, 08 Jun 2008 15:06:00 GMT</pubDate><guid>http://www.aygfsteel.com/glorywine/archive/2008/06/08/206726.html</guid><wfw:comment>http://www.aygfsteel.com/glorywine/comments/206726.html</wfw:comment><comments>http://www.aygfsteel.com/glorywine/archive/2008/06/08/206726.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/glorywine/comments/commentRss/206726.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/glorywine/services/trackbacks/206726.html</trackback:ping><description><![CDATA[ <p style="FONT-SIZE: 18pt; COLOR: #3366ff"> <strong style="FONT-SIZE: 18pt">关于q个教程<br /></strong> <font style="FONT-SIZE: 10pt; COLOR: #000000" size="3"> <br />        q是一个PyQt4的简单教E,目的是Z让大家对PyQt4有个初步的了解?/font> </p> <br /> <span style="FONT-SIZE: 18pt"> <strong style="COLOR: #3366ff">关于PyQt</strong> </span> <br /> <span style="FONT-SIZE: 10pt">         PyQt是一个GUI库,是将Python和Qtl合在一L产物。而Qt是目前比较成功和强大的GUI库。你可以通过讉K<a >www.riverbankcomputing.co.uk</a>了解更多关于PyQt的消息,目前主要的开发h员是 <strong>Phil Thompson</strong>.<br />         PyQt通过一lpython模块来实现的Q其中包括了过300个类Q尽6000个函数和Ҏ。非常好的是Q这个库是^台独立的Q可以运行于当前大多操作pȝ中,包括UnixQWindow和Mac。PyQt使用的是双许可证Q开发h员可以在GPL和商业许可之间进行选择。过去,GPL仅适用于UnixQ从PyQt4开始,GPLҎ有的q_开放?br />׃PyQt4包含了太多的c,所以开发h员将其分Z同的模块q行理?br /><img alt="" src="http://www.aygfsteel.com/images/blogjava_net/glorywine/modules.jpg" border="0" /><br /><span style="COLOR: #c0c0c0"><span style="FONT-SIZE: 10pt">?QPyQt4模块</span></span></span> <br /> <br /> <span style="FONT-SIZE: 10pt"> <span style="FONT-SIZE: 10pt"> <strong>         QtCore</strong>主要负责一些非GUI的功能,包括旉(time)Q文?files)和文件夹(directories)Q各U数据类?data types)Q流(stream)QurlsQmimecdQ线E?threads)和过E?processes)?strong>QtGui</strong>模块负责囑փlg和相关的c,包括常见的按?buttons)Q窗?windows)Q状态栏(status bars)Q工h(toolbars)Q滑动条(sliders)Q位?bitmaps)Q颜?colors)和字?fonts){?strong>QtNetwork</strong>则负责网l功能,通过该模块,可以完成hTCP/IP和UDP交互功能的C/S应用Q该模块使得|络开发非常的单便携?strong>QtXml</strong>包含了同xml文g交互的能力,模块实现了同SAX和DOM交互的APIs?strong>QtSvg</strong>提供了显CSVG文g内容的方法。Scalabe Vector Graphics(SVG)是用xml文g来描qCl图像的一U语a?strong>QtOpenGL</strong>通过使用OpenGL来呈?D?D囑փQ该模块Qt GUI库和OpenGL库无~的l合在一赗?strong>QtSql</strong>提供了访问数据库的方法?br /></span> <br /> <br /> <span style="FONT-SIZE: 18pt"> <strong style="COLOR: #00ccff"> <span style="COLOR: #3366ff"> <span style="FONT-SIZE: 18pt"> <strong>Python</strong> </span> </span> <br /> </strong> </span> <br /> <img alt="" src="http://www.aygfsteel.com/images/blogjava_net/glorywine/pythonlogo.png" border="0" />Python是单前非常成功的脚本语言Q最开始是?strong>Guido van Rossum</strong>q行开发的Q在1991q放ZW一个版本。Python的灵感来源于ABC和Haskell。Python是一个高U的Q跨q_的解释性语a。很多h喜欢其UCؓ动态语a。它非常Ҏ学习Q最明显的特征是Q它不需要分号和括号Q而是使用<strong>~进</strong>。目前最E_的版本应该是2.5.2Qƈ且有着来自全球的志愿者进行维护?007q_Python被评为年度语a?br /><br /><br /><span style="FONT-SIZE: 18pt"><strong style="COLOR: #3366ff">Python提C?/strong></span><br />        如果想用Pythonq行GUI开发,目前主要有三个选择QPyGTKQwxPython和PyQtQ可以根据开发环境进行选择。还有一个叫做TkInter的,使用的不是非常广泛?/span> <img src ="http://www.aygfsteel.com/glorywine/aggbug/206726.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/glorywine/" target="_blank">glorywine</a> 2008-06-08 23:06 <a href="http://www.aygfsteel.com/glorywine/archive/2008/06/08/206726.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">DZɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̳</a>| <a href="http://" target="_blank">۶</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">⽭</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">÷</a>| <a href="http://" target="_blank">ԭ</a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ǫ</a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">dz</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ݳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̩</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʯȪ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ī񹤿</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>