|
楼主 |
发表于 2012/1/24 22:41
来自手机
|
显示全部楼层
本帖最后由 飞翔的鱼 于 2012-1-24 22:43 编辑
评 论 [教程]跟米饭学PyS60编程(4.2)-图形界面
4.2 图形界面
想必大家学以前的那些东西都腻了吧.现在开始咱就学新东西了.但是你要做好心理准备,新东西可是越来越复杂了.而且我也会尽量少的讲解,以留给大家自己动脑的空间.还有,在进入新课之前你要确保以前的东西已经掌握,不然在学习中遇到由于基础不扎实造成的问题我可不会帮你解决的哦.一定要把基础打好.不要企图还不会走就跑.那样摔的是自己哦.好了,废话不说了.咱们先看一个图. 点击链接
这个图是我自己用代码画的.里面包含了矩形,线条,圆形,椭圆,文字.现在我们来看一下它的源码:
import appuifw
import e32
from graphics import *
def cn(x):return x.decode("utf-8")
ziti=u"CombinedChinesePlain12"
def exit():
global running
running=0
appuifw.app.set_exit()
appuifw.app.screen="full"
img=Image.new((176,208))
img.clear(0xe0e0ff)
img.rectangle((10,30,20,100),0xff0000,fill=0xff0000)
img.line((20,100,40,100),0xff0000)
img.point((60,65),0xff0000,width=40)
img.ellipse((40,30,80,100),0x0000ff)
img.line((90,30,100,100),0xff0000,width=10)
img.line((100,100,110,30),0xff0000,width=10)
img.line((130,30,130,100),0xff0000,width=10)
img.line((130,30,150,30),0xff0000,width=10)
img.line((130,65,140,65),0xff0000,width=10)
img.line((130,100,150,100),0xff0000,width=10)
img.text((60,130), cn("米饭教程"),0x333333,ziti)
def handle_redraw(rect):
canvas.blit(img)
appuifw.app.body=canvas=appuifw.Canvas(event_callback=None, redraw_callback=handle_redraw)
appuifw.app.exit_key_handler=exit
running=1
while running:
handle_redraw(())
e32.ao_yield()
点击下载此段代码
哎呀,好长的代码啊.
怎么讲解啊.一点一点的说吧.
首先我们来看最开始,import appuifw和e32两个模块.然后第三行的from graphics import * 这个的意思就是从graphics模块中引进所有变量.说这样你可能不懂.通俗一点,大家还记得以前写代码都是import appuifw然后下载都是appuifw.app.menu=...等等的吧.如果我们使用了from appuifw import *之后就应该写成app.menu=... 最简单的理解就是省的每次都写这个appuifw.了.但是普遍的说法都是:一般说来,应该避免使用from..import而使用import语句,因为这样可以使你的程序更加易读,也可以避免名称的冲突。(引自:简明 Python教程/第8章 模块/from..import语句) 但是这里的from graphics import * 我见过的绝大多数代码都这么写.因此我也就养成这习惯了.都是from.呵呵.大家也就照着这么写吧.
再下边的ziti=u"CombinedChinesePlain12"这个是定义ziti等于中文12号字体.下边会用到,先不说.记住这回事就可以了.
img=Image.new((176,208))这个是定义img为新建一个176*208的图片.冰雪大哥曾经提醒过我在写代码时候不要用这样的定值,因为有的机器屏幕大小不是176*208,以后咱们会学到如何定义这个值为屏幕大小.现在先不说.
img.clear(0xe0e0ff)这个我不知道是什么意思,但我知道它是设置图片的背景颜色用的.如果想背景是黑色就img.clear(0)就可以.里面的0xe0e0ff就是背景颜色的值.
img.rectangle((10,30,20,100),0xff0000,fill=0xff0000)这个的rectangle是画矩形.后面的数字依次是:矩形左上顶点的x坐标(也就是和屏幕最左边的距离),y坐标(和屏幕顶端的距离),矩形右下顶点的x坐标,y坐标. 0xff0000是矩形的边框颜色.fill=0xff0000是矩形内部的填充颜色.
img.line((20,100,40,100),0xff0000)这里的line是画线.后面的数字依次是:线条的端点X坐标,Y坐标,另一端点的x坐标,y坐标.
这样定义的线条是一细线条,如果想定义线条粗细的话就这样写:img.line((90,30,100,100),0xff0000,width=10)后面的width=的值就是粗细了.
img.point((60,65),0xff0000,width=40)这里的point是点的意思.也就是一个实心圆.里面的60,65是圆心的X,Y坐标.width=的值就是直径.
img.ellipse((40,30,80,100),0x0000ff)这里的ellipse的意思是椭圆.这里的四个值我不知道怎么解释...大家自己体会吧.你可以改一下里面的值感觉一下.我不知道那术语该怎么讲.有高中数学学的好的朋友请指点.后面的颜色是边框颜色,如果想填充颜色就这么写:img.ellipse((40,30,80,100),0x0000ff,fill=0x0000ff)
img.text((60,130), cn("米饭教程"),0x333333,ziti)这是在上面写字的.数字是文字左下角的X,Y坐标.注意是左下角.如果你写成0,0的话那字就显示不到屏幕上了. 后面跟的是要写的文字.再后面是文字的颜色.再后面的ziti大家应该明白了吧.就是说这段字要用上面定义的中文12号字.为什么要这样做呢?听我详细说来,因为我们写在这里的字是中文字,如果代码在没有装字库的手机上运行时会出现大家比较熟悉的口口.但如果写的是英文字的话就不会口口.因此这里我们要定义一下它的显示字体.看一下在我这个没装字库的手机上的口口效果: 点击链接
继续:
def handle_redraw(rect):
canvas.blit(img)这里是定义了重画的功能,就是为了让图片一遍一遍的在上面出现,不然的话只闪一次就变没了.这些东西你可以不必理解.只要用的时候往过复制就可以了.我都是这样做.嘿嘿.
appuifw.app.body=canvas=appuifw.Canvas(event_callback=None, redraw_callback=handle_redraw)这里是定义程序界面为canvas(画布).然后括号里面定义了一些返回动作.具体意思我也是一知半解中,在以后的学习中会明白的.
反正现在就这么写就是了.
running=1 是定义running为1.为什么要定义它为1呢?
下边的while running:的意思就是while 1: 其实这样写也是可以的.这个意思就是说在运行时.但是如果只写成while 1:的话,就无法定义停止了.听不懂没关系.不懂装懂吧.以后就懂了.
handle_redraw(())上面已经定义了说一遍一遍的画图.就是说在运行的时候一遍一遍的画图:)
e32.ao_yield()这里这个必须要写.如果不写这个的话程序就一直在那画啊画啊,根本不理会你按键,按退出它也不会理你,依然是在那画啊画啊画啊.强退都退不掉.只能疯狂的关才可以关掉或者用APPMAN强行关.但是定义了这个e32.ao_yield()之后,它在画啊画啊的同时会注意到你是不是在按退出键,因此你按了退出之后它就会很听话的关闭了.
我的天啊.不知不觉写了这么多.感觉是有点累了.最近玩电脑弄的肩膀非常疼.哪位有什么好点的办法麻烦告诉我一下.疼的真是很难过.睡觉了 |
|