window上面的js游戏框架主要用什么框架

JavaME 3D游戏开发框架(一)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
159页免费1页2下载券14页1下载券14页免费2页免费1页1下载券15页1下载券2页1下载券67页免费
喜欢此文档的还喜欢34页1下载券4页免费30页1下载券53页免费17页免费
JavaME 3D游戏开发框架(一)|J​a​v​a​M​E​ D​游​戏​开​发​框​架​(​一​)
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢您当前位置:&&&&&&&&&
售前咨询热线
Windows网络服务架构系列课程详解(七) windows域环境多区域间访问
Windows网络服务架构系列课程详解(七) windows域环境多区域间访问
实验背景:一个企业如果没有分公司,在单域环境下是可以实现大部分的用户需求的;但是,当公司的规模越来越多,在多个地区都建立了自己的分公司,用户账户和各种资源比较多,不同的分总司对用户的要求不一样(比如说密码策略,访问权限的设置等等),大量的活动目录给管理造成了一定的麻烦,域之间的复制负担过重等等,而公司又需要统一管理,这在单域环境下是很难完成的,维护起来也是相当的困难。因此,多域环境便应运而生,大型企业通过多个区域管理企业内部的用户和资源,而各个区域之间又存在上下级之间的关系,相当于总公司和分公司之间的关系,这样更有利于层次规划管理,从而提高了企业整体办公效率。总公司和分公司之间通过建立树根信任或者父子信任关系,进行单向或者双向的网络资源互访,不同两个公司之间可以通过建立外不信任或者林信任进行单向或者双向的网络资源互访,最终实现多个企业之间的网络互连和资源共享。实验目的:1、理解区域之间的上下级关系2、掌握林、域树和子域的部署过程3、掌握林中的信任关系(父子信任和树根信任)4、掌握林之间的信任关系(外部信任和林信任)5、掌握AGDLP规则,并利用其规则进行区域间资源的访问实验环境:本实验搭建了两个独立的林(两家独立的公司),其中一个林(企业&1)里建有一棵域树(也称之为一个林),通过根域和子域构成;根域和子域之间通过父子信任进行互访;另一个林(企业&2)里建有两棵域树(也称之为一个林),域树之间通过树根信任进行互访;另外两个林(企业&1与企业&2)之间通过外部信任或林信任进行互访。实验网络拓扑:
Windows网络服务架构系列课程详解(七) windows域环境多区域间访问(2)
实验步骤1. 准备实验环境,并创建林、子域和域树。1.1、首先,将Srv 1和Srv3分别升级为域控制器,升级过程中选择&新林中的域&,做为两个企业的根域,并将Srv 2加入到Srv 1域中,Srv 4加入到Srv 3中,加入域之后,在各自的根域DNS中会默认添加相应的主机记录。如下图Srv 1中DNS的记录1.2、添加用户xiaonuo和danuo分别到域和中,并将它们都加入各自的Enterprise Admins组中,通过这两个用户分别对各自的林的修改进行管理,也避免了管理员密码的多次使用造成泄露。在根域中存在两个全局安全组,分别为Enterprise Admins和Schema Admins,其他域是没有的。(以为例)Enterprise Admins:企业管理组,可以对活动目录中整个林作修改,例如添加子域(Domain admins组中的成员也可以添加子域)。Schema Admins:架构管理组:可以对活动目录整个林做架构修改,也就是用户或组的一些属性选项卡之类的架构,比如说Windows server 2003 R2和Windows server 2003 SP1的架构信息默认就不相同,如果SP1为根域,那么R2是不能够新建一个独立的域树的,原因是架构信息不一样造成的。
Windows网络服务架构系列课程详解(七) windows域环境多区域间访问(3)
1.3、在Srv 2上创建现有域树中的一个子域Srv 1上已经创建好了域根,也称之为一棵域树,也可以称之为一个林。向域树中添加的新域叫做子域(),名称是由子域本身的名称和父域域名结合而成的DNS名,子域上层的域是父域()。在存在且在线的情况下,在Srv 2上运行&dcpromo&选择&在现有域树中的子域&即可键入网络凭据,键入具有域的管理权限的账户和密码(administrator或者xiaonuo,也就是该账户必须是Enterprise Admins或者Domain Admins成员)输入父域(),然后输入添加子域的NETBIOS名称(xiaonuo),最终形成的域名为(域名必须符合DNS的命名规则)
Windows网络服务架构系列课程详解(七) windows域环境多区域间访问(4)
输入域的NetBIOS名称,默认为域名的最前部分,到这一步的时候,安装向导会在同一网段检查是否有重名,如果有重名,会在默认NetBIOS后面加上1,也可以更改成其它NetBIOS名称,客户端在登陆域的时候,只显示域的NetBIOS名称;客户端在加入域的时候,如果没有填写DNS,输入NetBIOS名称是可以加入到域的,使用的是NetBIOS协议,不过,前提是加入域的用户必须和域在同一个网段。配置完成之后,可以通过下一步进行域信息的复查,如果配置错误,可以单击&上一步&继续配置。确定无误之后,向导便开始安装域环境,首先会从以前加入的域()中脱离出来,然后,创建新的域。DNS中也会将此用户的记录删除。
Windows网络服务架构系列课程详解(七) windows域环境多区域间访问(5)
1.4、在Srv 4上创建现有的林中的域树假如您不想使新域成为现有域的子域,想拥有属于自己的一个域名,可以建立一个与现有树分开的、新的域树,它和域根之间通过建立树根信任进行互相通信,单个域树(只有一台DC)或多棵域树构成一个林。键入网络凭据,键入具有域的管理权限的账户和密码(administrator或者danuo,也就是该账户必须是Enterprise Admins或者Domain Admins成员)输入与不同的域名,此域名没有父域和子域之间的关系,只要符合DNS的域名命名标准就可以,输入完成之后,开始检查的NetBIOS名称tianjing是否在同一网段中使用,如果没有,默认域的NetBIOS名就为tianjing。
Windows网络服务架构系列课程详解(七) windows域环境多区域间访问(6)
创建子域和创建域树的一个重要区别就是,子域是通过父域的DNS进行名称解析的,而另外一棵域树是通过自己搭建的DNS进行名称解析的,当然,子域也可以搭建自己的DNS,一般在公司里,子域用于一些部门,而域树用于一些分公司,管理的范围大小不同。所以,子域是没有必要搭建一台独立的DNS,而域树需要搭建一台独立的DNS服务器进行本域树以及所有子域的名称解析。本实验搭建如果出现一下问题,说明您的两台域控制器版本不一样,比如说windows server 2003 SP1和windows server 2003 R2之间由于版本不一样,所以搭建的域架构信息也不一样。
Windows网络服务架构系列课程详解(七) windows域环境多区域间访问(7)
2. 林中的信任关系2.1、查看林中的信任关系林中的信任关系默认在安装域控制器时自动创建,父域和子域之间形成父子信任,如和之间的信任;域树和域树之间形成树根信任,如guangzhou.coom和之间的信任。林中信任关系的特点是自动创建;而且可以传递信任,也就是说域A直接信任域B,域B直接信任域C,那么域A直接信任域C;还可以双向信任,两个域之间可以互相信任,处于平等地位。打开&Active Directory 域和信任关系&右击域的属性,可以查看域在林中的信任关系
Windows网络服务架构系列课程详解(七) windows域环境多区域间访问(8)
2.2、使用ADGLP规则实现林中跨域访问林中的所有域之间的信任关系时自动创建的,而且时双向的和棵传递的信任关系,这会不会造成林中的任何账户都能轻易访问其他域的资源呢?答案是否定的。信任关系的建立仅仅只为跨域访问资源提供了前提条件,但是要成功访问资源还必须设置要访问文件夹的共享和安全权限。AGDLP规则:首先将具有相同访问权限的用户加入的全局组,然后,将所有具有相同性质的全局组加入到一个本地域组,然后给本地域组赋予权限即可。现在存在这样一个环境,域全局组quanjuzu里的一个用户ceshi想访问域中的共享资源。首先,在域上创建一个用户ceshi,然后创建一个全局组quanjuzu,将ceshi加入到quanjuzu中,而实际应用中,quanjuzu中应该有多个具有同样性质的用户,然后,在子域上创建一个本地域组bendiyuzu,并将域中全局组quanjuzu加入到子域中的本地域组bendiyuzu中。注意:加入的时候,需要修改查找位置,将当前位置改为然后在子域上新建一个文件夹,命名为ceshi,并设置其共享权限为bendiyuzu读取,NSFS权限为bendiyuzu读取和运行,最终的权限为两者的叠加,即为读取权限。然后在加入域的机器上使用用户ceshi登陆到域上,通过UNC路径访问域上的共享文件。注意:上面只是其中的一种访问方法,另外一种是可以到加入域的机器上登陆到域,然后进行共享资源的访问。
Windows网络服务架构系列课程详解(七) windows域环境多区域间访问(9)
3. 林之间的信任之一:外部信任外部信任是指在不同林的域之间创建的不可传递的信任,外部信任在windows 2000混合模式、windows 2000 纯模式或者windows 2003上都可以做。假如现在有这样一个环境,域里的用户ceshi想访问中资源,而域中的用户不能够访问域中资源。3.1、配置各自根域DNS的转发器指向对方的DNS上。要使两个根域的计算机互相解析出对方的DNS域名,需要将各自在DNS上配置&转发器&,互相指向对方。例如,下面是将Srv 1上DNS的&转发器&指向Srv 3的DNS上。注意:配置完成之后,一定要在各自的DNS服务器上解析一些对方的域名,看是否能够解析成功。打开域的属性窗口,并选择&新建信任&输入将要信任或者被信任的域选择&单向:内传&也就是说这个域中的用户可以到域中得到身份验证。
Windows网络服务架构系列课程详解(七) windows域环境多区域间访问(10)
由于信任关系是在两个域之间建立的,如果在域建立一个&单向:内传&信任,则需要在域上必须建立一个&单向:外传&信任。如下图所示,选择第二项,可以在对方域中自动创建一个&单向:外传&的信任。接下来键入指定域中具有管理权限的账户名称和密码,输入用户administrator和danuo都可以。只要是Enterprise admins组中用户都可以。联系到域之后,便显示了信任的基本设置,确认无误之后,选择&下一步&建立信任关系。
Windows网络服务架构系列课程详解(七) windows域环境多区域间访问(11)
在这一步的时候,一定要选择&是,确定传入信任&,否则,刚做的操作都实现不了了。创建完成之后,可以通过打开&Active Directory&在或者的属性选项卡上进行查看,然后以利用AGDLP规则进行测试。注意:如果两个林域根建立的外部信任之后,林中的每个域都可以和另外一个林中其中的一个域建立信任关系,这个叫快捷信任。
Windows网络服务架构系列课程详解(七) windows域环境多区域间访问(12)
4. 林之间的信任之一:外部信任4.1、搭建林信任之间的必须条件林信任是windows server 2003林特有的信任,是windows server 2003林根域之间建立的信任。在两个windows server 2003林之间创建林信任棵为任一林内的各个域之间提供一种单向或双向的可传递信任关系。它的传递性区别于外部信任。林信任适用于应用程序服务提供商、正在经历合并或收购的公司、合作企业Extranet以及寻求管理自治解决方案的公司。创建林信任和创建外部信任类似,不同的是创建林信任之前要升级为林功能级别为windows server 2003,这是创建林信任的前提条件。升级林功能级别之前,需要将林中所有域的域功能级别设置为windows 2000纯模式或windows server 2003打开&Active Directory 域和信任关系&,将所有的域提升为windows 2000纯模式。提升完域控制器之后,右击&Active Directory 域和信任关系&,选择&提升林功能级别&,然后提升为windows server 2003,注意,如果域控制器没有提升为windows 2000 纯模式或者windows 2003,那么提升域功能级别就会报一个警告。
Windows网络服务架构系列课程详解(七) windows域环境多区域间访问(13)
4.2、创建林信任打开域的属性,选择&信任&,然后选择&新建信任&输入被信任或者将要信任的域然后,选择&林信任&创建一个双向信任,也可以创建单向(内传,外传)信任,根据具体情况而定。选择第二项,域上同时创建双向的林信任关系。接下来键入指定域中具有管理权限的账户名称和密码,输入用户administrator和danuo都可以,前提必须是Enterprise admins组中用户。
Windows网络服务架构系列课程详解(七) windows域环境多区域间访问(14)
选择&全林性身份验证&,windows 将自动对指定林()的所有用户使用本地林()的所有资源进行身份验证。建立好林信任之后,可以通过在&Active Directory 域和信任关系&选择域或者域进行查看,从下图可以看出,林信任是具有传递性的。出处:http://dreamfire./361
聚生网管官网,控制别人网速,员工上网管理软件,电脑上网流量限制,限制局域网下载速度,控制其他人网速
大势至公司网络管理产品:
1、,是国内最早、最专业的局域网监控软件、上网行为控制系统,可以有效管理公司局域网电脑上网行为,有效屏蔽迅雷下载、禁止迅雷上传,禁止pps上传、禁止看qq直播、禁止局域网玩游戏、禁止登录QQ游戏大厅、禁止员工炒股、限制上班看电影、进行局域网带宽限制、控制打开网页、禁止局域网网购、监控邮件内容、监控邮件附件、记录论坛发帖留言、防ARP攻击、查找局域网手机、禁止手机接入公司局域网、禁止私自安装无线路由器上网、防止无线局域网蹭网等;
2、,专业的上网行为管理服务器、比上网行为管理路由器、上网管理路由器更强大,可以有效禁止电脑游戏、屏蔽网页游戏、限制局域网看视频、禁止别人看视频、限制P2P软件使用、禁止快车下载、局域网控制迅雷下载、限制股票软件、禁止上班炒股行为、进行局域网流量监控、限制带宽软件,禁止员工网络购物、屏蔽购物网站、屏蔽网页视频网站,并且独创了&创新直连&监控模式,国内最快捷、最简单、最安全控制多网段电脑上网行为,监控效率和综合性能最强的硬件网络管理系统、上网行为管理系统。
3、,一款强大的USB端口控制系统,有效禁用USB端口使用、屏蔽U口、禁止电脑使用U盘、屏蔽优盘使用、禁用优盘,禁止移动硬盘使用、禁止手机存储卡使用,可以有效地屏蔽USB存储设备而不影响USB鼠标键盘和非USB设备的使用;同时,还可以禁止修改注册表、禁止修改组策略、禁止修改msconfig启动项、禁止修改计算机管理、禁止F8键进入安全模式、禁止U盘启动电脑、禁止光驱启动电脑;此外,还可以只允许电脑访问特定网站,只让打开特定程序、只让运行特定软件或者禁止运行某些程序、禁止访问某些网站等;
4、,是一款强大的共享文件服务器监控软件、服务器文件管理系统、服务器文件访问控制软件,最有效监控服务器共享文件的访问,详细记录修改服务器共享文件、删除服务器共享文件、复制服务器共享文件、剪切服务器共享文件或者打印服务器共享文件的行为,以及重命名共享文件等;同时,记录访问共享文件者的IP地址、MAC地址、主机名和域账号等信息,从而可以为网管员提供详细的服务器文件访问日志,便于加强服务器共享文件管理,保护单位无形资产和商业机密等;
5、,是一款专业的公司局域网接入管理软件、内网接入控制系统,可以有效防止非公司电脑访问公司局域网、禁止外部电脑访问公司局域网、限制外来电脑接入公司局域网、禁止手机接入公司局域网、禁止手机无线上网、限制平板电脑无线上网,检测局域网处于混杂模式的网卡,防止局域网抓包、防止局域网嗅探;同时,还可以查找局域网无线路由器,禁止无线路由器接入公司局域网,禁止无线路由器上网,禁止局域网启用代理,限制员工代理上网,禁止电脑安装代理软件为其他电脑提供代理上网服务等;
国内领先企业网络管理方案提供商——大势至(北京)软件工程有限公司简介:大势至公司是国内专业的企业上网管理软件、局域网网络管理软件提供商,公司核心产品:聚生网管监控软件(有效禁止局域网下载、禁止局域网玩游戏、禁止在线看视频、禁止上网软件、禁止局域网下载、局域网网速控制软件、局域网禁用随身wifi、禁止上网购物、限制局域网网购、局域网限速管理软件、局域网控制上网软件、局域网流量监控软件、局域网带宽分配软件、上网行为管理系统、计算机网络管理软件、最好用的网管软件、免费网管软件下载、计算机网络管理软件排行榜第一名……);大势至服务器共享文件管理软件(是一款专门监控服务器共享文件访问日志的软件,详细记录服务器共享文件的打开、读取、复制、修改、删除、剪切和重命名等操作,防止删除服务器共享文件、禁止复制服务器共享文件,分配共享文件访问权限,是一款专门的服务器文件管理软件、文件共享服务器监控软件、局域网共享文件设置软件、局域网共享文件管理软件……);大势至网络准入控制系统(一款专门的局域网接入管理软件,禁止外来电脑接入局域网、隔离局域网电脑、禁止电脑相互通讯、检测局域网无线路由器、检测局域网手机、防止蹭网、禁止局域网代理上网、防止网络嗅探、禁止修改MAC地址、禁止修改IP地址、绑定IP和MAC地址、禁止外来电脑上网、禁止外来电脑访问公司文件服务器、禁止访问共享文件、禁止非公司电脑接入公司局域网,实现全面的局域网网络接入控制和安全防范……);大势至电脑USB禁用软件(一款禁用U盘软件、电脑USB接口禁用软件、计算机USB端口禁用软件、微机USB屏蔽软件、禁用USB存储设备、禁用手机存储卡、禁止复制电脑文件到U盘、禁用360随身wifi、屏蔽随身wifi、禁止wifi共享、禁止修改注册表、禁止打开组策略、禁止U盘启动电脑、禁止光驱启动电脑、WIN7禁止安装软件、禁止电脑运行软件、禁止发邮件、禁止网盘上传文件、禁止QQ发文件、禁用光驱、只让电脑运行某个软件、禁止电脑上网、只让电脑打开某个网站、只让电脑运行某些程序等)。大势至四款核心局域网电脑管理软件可以协调配合,为企业提供全面的员工上网行为管理、电脑文件安全管理软件和商业机密保护,保障企业高效率、稳健运转!
京ICP备号 京公网安备当前位置: >
> 转载别人的WxPythonwx.Window是一个基类,许多构件从它继承。包括wx.Frame构件
转载别人的WxPythonwx.Window是一个基类,许多构件从它继承。包括wx.Frame构件
syr320 & at
转载别人的WxPython
wx.Window 是一个基类,许多构件从它继承。包括 wx.Frame 构件。技术上这意味着,我们可以在所有的 子类中使用 wx.Window 的方法。我们这里介绍它的几种方法:* SetTitle( string title ) —— 设置窗口标题。只可用于框架和对话框。 * SetToolTip( wx.ToolTip tip ) —— 为窗口添加提示。 * SetSize( wx.Size size ) —— 设置窗口的尺寸。 * SetPosition( wx.Point pos ) —— 设置窗口出现的位置。 * Show( show = True ) —— 显示或隐藏窗口。其中的参数可以为 True 或False。 * Move( wx.Point pos ) —— 将窗口移动到指定位置。 * SetCursor( wx.StockCursor id ) —— 设置窗口的鼠标指针样式。 Python代码& import wx& app = wx.PySimpleApp()& frame = wx.Frame( None, -1, '' )& frame.SetToolTip( wx.ToolTip( 'This is a frame' ) )& frame.SetCursor( wx.StockCursor( wx.CURSOR_MAGNIFIER ) )& frame.SetPosition( wx.Point( 0, 0 ) )& frame.SetSize( wx.Size( 300, 250 ) )& frame.SetTitle( 'simple2.py' )& frame.Show()& app.MainLoop()&
我们创建了一个"This is a frame"提示。鼠标指针被设置为放大镜样式。可用的鼠标指针样式有:wx.CURSOR_ARROWwx.CURSOR_RIGHT_ARROWwx.CURSOR_BLANKwx.CURSOR_BULLSEYEwx.CURSOR_CHARwx.CURSOR_CROSSwx.CURSOR_HANDwx.CURSOR_IBEAMwx.CURSOR_LEFT_BUTTONwx.CURSOR_MAGNIFIERwx.CURSOR_MIDDLE_BUTTONwx.CURSOR_NO_ENTRYwx.CURSOR_PAINT_BRUSHwx.CURSOR_PENCILwx.CURSOR_POINT_LEFTwx.CURSOR_POINT_RIGHTwx.CURSOR_QUESTION_ARROWwx.CURSOR_RIGHT_BUTTONwx.CURSOR_SIZENESWwx.CURSOR_SIZENSwx.CURSOR_SIZENWSEwx.CURSOR_SIZEWEwx.CURSOR_SIZINGwx.CURSOR_SPRAYCANwx.CURSOR_WAITwx.CURSOR_WATCHwx.CURSOR_ARROWWAIT我们把窗口放在了左上角,大小是 300x250 像素,标题被设置为"simple2.py"。
======================================================================
wx.Frame 是一个容器构件。这意味着它可以容纳其它构件。它有如下的构造器:wx.Frame( wx.Window parent, id, string title, wx.Point pos=wx.DefaultPosition, wx.Size size=wx.DefaultSize, style = wx.DEFAULT_FRAME_STYEL, string name='frame' )构造器是一种特殊的函数。它在对象创建时被调用。对于我们来说重要的是,我们打算创建一个新的构件时,只要简单的调用它的构造器就行了。Python允许 参数有默认值。所以在wx.Frame中必须的参数就只剩下了parent、id和title了。如果你按顺序指定参数的值,那么你可以不必带上参数的名 称。比如你想创建一个wx.Frame构件,它没有parent,标识符是100,标题是"Title",位置在(100,50)大小是 (100,100):frame=wx.Frame(None,100,'Title',wx.Point(100,50),wx.Size(100,100))下面我们省略了 pos 参数。所以必须明确的提供 size 参数:frame=wx.Frame(None,100,'Title',size=wx.Size(100,100))下面的例子,我们将使用其它有用的特性: Python代码& import wx& def main():& app=wx.PySimpleApp()& frame=wx.Frame(None,-1,'Icon',wx.DefaultPosition,wx.Size(350,300))& frame.SetIcon(wx.Icon('Tipi.ico',wx.BITMAP_TYPE_ICO))& frame.Center()& frame.Show()& app.MainLoop()& if __name__ == '__main__':& main()&
Icon文件名为Iipi.ico。位于当前目录下。Icon构造器的第一个参数是Icon文件名,第二个参数是 Icon 文件类型。就像你注意到的,程序的结构发生了改变。这样才符合Python编程的标准。在Python中,__name__ 是一个特殊的变量。更复杂的程序通常由几个文件组成,但仅有一个文件用于开启程序。对于这个文件,当你直接执行它时,Python设置__name__变 量的值为'__main__'。所以,如果你双击icon.py或从命令行直接执行它,__name__ 变量的值就会等于__main__。main()函数也就会被调用。
======================================================================
创建一个菜单栏在wxPython中相当简单。我们将讨论给菜单栏添加菜单、为已经存在的菜单添加子菜单。所有菜单都有菜单项组成。菜单项可以是常规项、复选项以及单选项。 先来创建一个菜单栏:menubar = wx.MenuBar()接着创建我们的菜单:file = wx.Menu()edit = wx.Menu()help = wx.Menu()然后为菜单添加菜单项。做这件事有两种方式:file.Append( 101, '&Open', 'Open a new document' )file.Append( 102, '&Save', 'Save the document' )我们可以使用横线来分隔逻辑区域:file.AppendSeparator()如果你想在菜单中使用 Icon,你需要手工创建 MenuItem 对象:quit=wx.MenuItem(file,105,'&Quit\tCtrl+Q','Quit the Application')quit.SetBitmap(wx.Image('stock_exit-16.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap())file.AppendItem(quit)wxPython工具包只能把bitmap图片用于菜单,所以我们需要把我们的PNG图片转换为bitmap格式。然后把菜单加入到菜单栏:menubar.Append( file, '&File' )menubar.Append( edit, '&Edit' )menubar.Append( help, '&Help' )最后在我们的程序类中创建菜单栏:self.SetMenuBar( menubar )我们把上述这些组成个小脚本:Python代码& #!/usr/bin/env python& # FileName: menu1.py& import wx& class MyMenu( wx.Frame ):& def __init__(self,parent,ID,title):& wx.Frame.__init__(self,parent,-1,title,wx.DefaultPosition,wx.Size(200, 150))& menubar=wx.MenuBar()& file=wx.Menu()& edit=wx.Menu()& help=wx.Menu()& file.Append(101,'&Open','Open a new document')& file.Append(102,'&Save','Save the document')& file.AppendSeparator()& quit=wx.MenuItem(file,105,'&Quit\tCtrl+Q','Quit the Application')& quit.SetBitmap(wx.Image('stock_exit-16.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap())& file.AppendItem(quit)& menubar.Append(file,'&File')& menubar.Append(edit,'&Edit')& menubar.Append(help,'&Help')& self.SetMenuBar( menubar )& & class MyApp(wx.App):& def OnInit(self):& frame=MyMenu(None,-1,'menu1.py')& frame.Show(True)& return True& & app=MyApp(0)& app.MainLoop()&
到目前为止我们已经知道了如何定义默认的普通菜单项。接下来让我们看看如何明确的定义复选菜单项和单选菜单项:edit.Append( 201, 'check item1', '', wx.ITEM_CHECK )edit.Append( 202, 'check item2', '', kind=wx.ITEM_CHECK )或者quit=wxMenuItem(file,105,'&Quit\tCtrl+Q','Quit the Application', wx.ITEM_NORMAL)其中那个参数被称为种类。可选的种类有:* wx.ITEM_NORMAL —— 默认* wx.ITEM_CHECK —— 复选* wx.ITEM_RADIO —— 单选如果你想创建子菜单,要先创建一个菜单:submenu = wx.Menu()然后为此子菜单添加一些菜单项:submenu.Append( 301, 'radio item1', kind= wx.ITEM_RADIO )submenu.Append( 302, 'radio item2', kind=wx.ITEM_RADIO )submenu.Append( 303, 'radio item3', kind=wx.ITEM_RADIO )把子菜单添加到某个菜单对象就成了:edit.AppendMenu( 203, 'submenu', submenu )最后,我们来看一下如何响应用户的动作。我们只是简单的感受一下。后面会有更详细的解释。当用户选择了某个菜单项时,就产生了一个事件。我们必须提供一个事件处理器,用它反应相应的事件。在 wxPython 中处理事件是到目前为止我已知最优雅最简单的了。如果翻参考手册,你会发现 wx.EVT_MENU 处理在事件处理那章。假如我们想为 quit 菜单项添加一个事件处理器:wx.EVT_MENU( self, 105, self.OnQuit )我们需要提供三个信息。我们要把事件处理器绑定到的那个对象。这里是 self, 程序的主对象。与之相匹配的菜单项的 id。以及处理事件的方法的名称。对用户的动作做出反应的方法需要两个参数。第一个是方法定义于其中的那个对象。第二个是产生的事件。本例中,我们什么也不做,只是简单的关闭我们的程序:def OnQuit( self, event ):self.Close()下面的脚本会展示上面说的各种菜单项、子菜单以及一个简单的事件处理。我讨厌程序窗口出现在角落里,所以加上了:self.Centre()这样窗口就会出现在屏幕的当中。 Python代码& #!/usr/bin/python& # FileName: menu2.py& import wx& & class MyMenu(wx.Frame):& def __init__(self, parent, ID, title):& wx.Frame.__init__(self, parent, -1, title,& wx.DefaultPosition, wx.Size(380, 250))& menubar = wx.MenuBar()& file = wx.Menu()& edit = wx.Menu()& help = wx.Menu()& file.Append(101, '&Open', 'Open a new document')& file.Append(102, '&Save', 'Save the document')& file.AppendSeparator()& quit = wx.MenuItem(file, 105, '&Quit\tCtrl+Q', 'Quit the Application')& quit.SetBitmap(wx.Image ('gtk-quit.png',& wx.BITMAP_TYPE_PNG).ConvertToBitmap())& file.AppendItem(quit)& edit.Append(201, 'check item1', '', wx.ITEM_CHECK)& edit.Append(202, 'check item2', kind= wx.ITEM_CHECK)& submenu = wx.Menu()& submenu.Append(301, 'radio item1', kind=wx.ITEM_RADIO)& submenu.Append(302, 'radio item2', kind=wx.ITEM_RADIO)& submenu.Append(303, 'radio item3', kind= wx.ITEM_RADIO)& edit.AppendMenu(203, 'submenu', submenu)& menubar.Append(file, '&File')& menubar.Append(edit, '&Edit')& menubar.Append(help, '&Help')& self.SetMenuBar(menubar)& self.Centre()& & wx.EVT_MENU(self, 105, self.OnQuit)& def OnQuit(self, event):& self.Close()& class MyApp(wx.App):& def OnInit(self):& frame = MyMenu(None, -1, 'menu2.py')& frame.Show(True)& return True& app = MyApp(0)& app.MainLoop()&
======================================================================
工具栏是一个集合了大多数常用命令和动作的构件。典型的象保存、打开、剪切、复制、粘贴、撤销、重复等。目的是为了节省时间。从工具栏执行动作只需点击一下,而从菜单需要点击两下。Python代码& #!/usr/bin/env python& # FileName: toolbar.py& import wx& class MyToolBar( wx.Frame ):& & def __init__( self, parent, ID, title ):& wx.Frame.__init__( self, parent, ID, title, wx.DefaultPosition, wx.Size( 350, 250 ) )& & vbox = wx.BoxSizer( wx.VERTICAL )& toolbar = wx.ToolBar( self, -1, style=wx.TB_HORIZONTAL | wx.NO_BORDER )& toolbar.AddSimpleTool( 1, wx.Image( 'stock_new.png', wx.BITMAP_TYPE_PNG ).ConvertToBitmap(), 'New', '' )& toolbar.AddSimpleTool( 2, wx.Image( 'stock_open.png', wx.BITMAP_TYPE_PNG ).ConvertToBitmap(), 'Opne', '' )& toolbar.AddSimpleTool( 3, wx.Image( 'stock_save.png', wx.BITMAP_TYPE_PNG ).ConvertToBitmap(), 'Save', '' )& toolbar.AddSeparator()& toolbar.AddSimpleTool( 4, wx.Image( 'stock_exit.png', wx.BITMAP_TYPE_PNG ).ConvertToBitmap(), 'Exit', '' )& toolbar.Realize()& & vbox.Add( toolbar, 0, border=5 )& self.SetSizer( vbox )& self.statusbar = self.CreateStatusBar()& & self.Centre()& & wx.EVT_TOOL( self, 1, self.OnNew )& wx.EVT_TOOL( self, 2, self.OnOpen )& wx.EVT_TOOL( self, 3, self.OnSave )& wx.EVT_TOOL( self, 4, self.OnExit )& & def OnNew( self, event ):& self.statusbar.SetStatusText( 'New Command' )& & def OnOpen( self, event ):& self.statusbar.SetStatusText( 'Open Command' )& & def OnSave( self, event ):& self.statusbar.SetStatusText( 'Save Command' )& & def OnExit( self, event ):& self.Close()& & class MyApp( wx.App ):& def OnInit( self ):& frame = MyToolBar( None, -1, ' toolbar.py' )& frame.Show( True )& return True& & app = MyApp( 0 )& app.MainLoop()&
wx.BoxSizer 在后面的布局章节会解释到。工具栏构件通过三步创建。首先,我们创建一个工具栏对象。tollbar = wx.ToolBar( self, -1, style= wx.TB_HORIZONTAL | wx.NO_BORDER )然后我们使用 AddSimpleTool() 方法为工具栏添加了几个工具。你在参考手册中找不到这个方法。它是一个 wxPython 扩展。这既是个诅语也是个祝福。它合 Python 编程变得容易。但另一方面,这些扩展没有被写入文档。你不得不通过浏览源代码、demo 或者在邮件列表中提问来了解它们。toolbar.AddSimpleTool(1,wx.Image('stock_new.png',wx.BITMAP_TYPE_PNG).ConvertToBitmap(),'New','')最后,我们调用 Realize() 方法。这个方法显示工具栏构件。toolbar.Realize()工具栏有好几个事件处理顺。当你点击工具栏上的图标时,就会产生一个wx.EVT_COMMAND_TOOL_CLICKED事件。我们把此事件绑定的某个具体的wx.EVT_TOOL处理器方法上。为了显示相关的输出,我们创建了一个状态栏。self.statusbar = self.CreateStatusBar()这仍然是另外一个 wxPython 扩展。这样一旦我们点击工具栏按纽,状态栏就会显示相关信息。这是通过使用 SetStatusText() 方法达成的。
======================================================================
有两种基本的方法可以用来布置我们的构件。第一种是手工布置。我们通过在构造器中指定位置来摆放我们的构件。Python代码& #!/usr/bin/evn python& import wx& class MyFrame(wx.Frame):& def __init__(self,parent,ID,title):& wx.Frame.__init__(self,parent,ID,title,wx.DefaultPosition,wx.Size(250,50))& panel=wx.Panel(self,-1)& & wx.Button(panel,-1,'Button1',(0,0))& wx.Button(panel,-1,'Button2',(80,0))& wx.Button(panel,-1,'Button3',(160,0))& & class MyApp(wx.App):& def OnInit(self):& frame=MyFrame(None,-1,'layout.py')& frame.Show(True)& frame.Centre()& & app = MyApp(0)& app.MainLoop()&
当窗口大小改变时,按纽的大小和位置并不改变。这是手工设置构件位置的一个主要特征。第二种方法是使用布局管理器。这是现实程序中比较流行的方法。基本上你要使用 sizer。我们将讨论:* wx.BoxSizer* wx.StaticBoxSizer* wx.GridSizer* wx.GridBagSizer
======================================================================
我们来写一个程序,它的窗口顶部的一行被三个按纽占据。这些按纽会随窗口的改变而改变。
Python代码& #!/usr/bin/env python& # FileName: wxboxsizer.py& import wx& class MyFrame(wx.Frame):& def __init__(self,parent,ID,title):& wx.Frame.__init__(self,parent,ID,title,(-1,-1),wx.Size(250,50))& panel=wx.Panel(self,-1)& box=wx.BoxSizer(wx.HORIZONTAL)& box.Add( wx.Button( panel, -1, 'Button1' ), 1 )& box.Add( wx.Button( panel, -1, 'Button2' ), 1 )& box.Add( wx.Button( panel, -1, 'Button3' ), 1 )& & panel.SetSizer(box)& self.Centre()& & class MyApp(wx.App):& def OnInit(self):& frame = MyFrame( None, -1, 'wxboxsizer.py' )& frame.Show(True)& return True& & app = MyApp(0)& app.MainLoop()&
我既可水平的摆放构件,也可竖直的摆放。box = wx.BoxSizer( integer orient )其中的方向(orient)可以是 wx.VERTICAL 或 wx.HORIZONTAL。将构件加入 wx.BoxSizer 要使用 Add() 方法。为了理解,我们来看一下它的参数。Add(wx.Window window,integer proportion=0,integer flag=0,integer border=0)其中的 proportion 参数定义了在定义的方向上构件改变的比例。假设我们有三个按纽,它们的 proportion 属性分别为0、1和2。它们被加入一个水平的 wx.BoxSizer。proportion 参数为 0 的按纽根本不发生变化。而这个参数值为 2 的按纽在水平方向改变的程序将是参数值为 1 的那个按纽的两倍。flag 参数可以更深入的设置构件的属性。我们可以控制构件之间的边框。我们可以在构件之间增加一些空白象素。在要使用边框的地方我们需要定义边界。我们可以使用 | 符号来连接它们。比如 wx.LEFT | wx.BOTTOM 。flag参数的值可以是:* wx.LEFT* wx.RIGHT* wx.BOTTOM* wx.TOP* wx.ALL如果我们使用 wx.EXPAND 标识,我们的构件将占据所有分配给它的空间。最后,我们还可以定义构件的对齐方式。有以下几种:* wx.ALIGN_LEFT* wx.ALIGN_RIGHT* wx.ALIGN_TOP* wx.ALIGN_BOTTOM* wx.ALIGN_CENTER_VERTICAL* wx.ALIGN_CENTER_HORIZONTAL* wx.ALIGN_CENTER看一个例子:Python代码& #!/usr/bin/python& # FileName: layout3.py& import wx& class MyFrame( wx.Frame ):& def __init__( self, parent, ID, title ):& wx.Frame.__init__(self,parent,ID,title,(-1,-1),wx.Size(450,300))& & panel = wx.Panel(self,-1)& box = wx.BoxSizer( wx.HORIZONTAL )& & box.Add( wx.Button( panel, -1, 'Button1' ), 1, wx.ALL, 5 )& box.Add( wx.Button( panel, -1, 'Button2' ), 0, wx.EXPAND )& box.Add( wx.Button( panel, -1, 'Button3' ), 0, wx.ALIGN_CENTER )& & panel.SetSizer( box )& self.Center()& & class MyApp( wx.App ):& def OnInit( self ):& frame = MyFrame( None, -1, 'layout3.py' )& frame.Show( True )& return True& & app = My App( 0 )& app.MainLoop()&
这个例子中,我们仍旧是创建了三个按纽。第一个的周围有一些边界。它是唯一一个可以在水平方向改变大小的,当主窗口的大小改变时。第二个按纽占据了分配给它的所有空间。第三个在竖起方向据中对齐。我们可以任意组合 wx.BoxSizer 。例如,我们可以将几个水平的 wx.BoxSizer 放在一个竖起的 wx.BoxSizer 中或者相反。这样我们就能产生复杂的布局。 Python代码& #!/usr/bin/env python& # FileName: borders.py& import wx& class MyFrame( wx.Frame ):& def __init__( self, parent, id, title ):& wx.Frame.__init__( self, parent, id, title )& & vbox = wx.BoxSizer( wx.VERTICAL )& hbox1 = wx.BoxSizer( wx.HORIZONTAL )& hbox2 = wx.BoxSizer( wx.HORIZONTAL )& & pnl1 = wx.Panel( self, -1, style=wx.SIMPLE_BORDER )& pnl2 = wx.Panel( self, -1, style=wx.RAISED_BORDER )& pnl3 = wx.Panel( self, -1, style=wx.SUNKEN_BORDER )& pnl4 = wx.Panel( self, -1, style=wx.DOUBLE_BORDER )& pnl5 = wx.Panel( self, -1, style=wx.STATIC_BORDER )& pnl6 = wx.Panel( self, -1, style=wx.NO_BORDER )& & hbox1.Add( pnl1, 1, wx.EXPAND | wx.ALL, 3 )& hbox1.Add( pnl2, 1, wx.EXPAND | wx.ALL, 3 )& hbox1.Add( pnl3, 1, wx.EXPAND | wx.ALL, 3 )& & hbox2.Add( pnl4, 1, wx.EXPAND | wx.ALL, 3 )& hbox2.Add( pnl5, 1, wx.EXPAND | wx.ALL, 3 )& hbox2.Add( pnl6, 1, wx.EXPAND | wx.ALL, 3 )& & vbox.Add( hbox1, 1, wx.EXPAND )& vbox.Add( hbox2, 1, wx.EXPAND )& & self.SetSizer( vbox )& self.Centre()& & class MyApp( wx.App ):& def OnInit( self ):& frame = MyFrame( None, -1, 'borders.py' )& frame.Show( True )& return True& & app = MyApp( 0 )& app.MainLoop()&
在这个例子中,我们创建了一个两行三列的表格。我们创建了一个竖直的 wx.BoxSizer 和两个水平的 wx.BoxSizer。我们只是简单的把两个水平的放进了那个竖直的中了。我们展示了六种可用的边框样式。边框是简单的窗口装饰品。注意其中两个边框样 式只能在 windows 上使用。边框:* wx.SIMPLE_BORDER* wx.RAISED_BORDER* wx.SUNKEN_BORDER* wx.DOUBLE_BORDER* wx.STATIC_BORDER* wx.NO_BORDER
====================================================================== wx.GridSizer 使用两维的表格来布局它里面的东西。每个表格的宽度等于它里面最大那个构件的宽度,高度等于它里面高度最大的那个构件的高度。wx.GridSizer( integer rows, integer cols, integer vgap, integer hgap )在构造器中,我们设定行和列的数目以及构件的水平和竖直间距。我们使用 AddMany() 方法将我们的构件插入到表中。按照从左到右、从上到下的顺序。 Python代码& #!/usr/bin/env python& # FileName: calculator.py& import wx& class MyFrame( wx.Frame ):& def __init__( self, parent, id, title ):& wx.Frame.__init__(self,parent,id,title,wx.DefaultPosition,wx.Size(300, 250))& & self.formula = False& & menubar = wx.MenuBar()& file = wx.Menu()& file.Append( 22, '&Quit', 'Exit Calculator' )& menubar.Append( file, '&File' )& self.SetMenuBar( menubar )& & wx.EVT_MENU( self, 22, self.OnClose )& sizer = wx.BoxSizer( wx.VERTICAL )& & self.display = wx.TextCtrl(self, -1, '', style=wx.TE_RIGHT)& sizer.Add(self.display, 0, wx.EXPAND|wx.TOP|wx.BOTTOM, 4)& gs = wx.GridSizer(4, 4, 3, 3)& gs.AddMany([(wx.Button(self, 20, 'Cls'), 0, wx.EXPAND),& (wx.Button(self, 21, 'Bck'), 0, wx.EXPAND),& (wx.StaticText(self, -1, ''), 0, wx.EXPAND),& (wx.Button(self, 22, 'Close'), 0, wx.EXPAND),& (wx.Button(self, 1, '7'), 0, wx.EXPAND),& (wx.Button(self, 2, '8'), 0, wx.EXPAND),& (wx.Button(self, 3, '9'), 0, wx.EXPAND),& (wx.Button(self, 4, '/'), 0, wx.EXPAND),& (wx.Button(self, 5, '4'), 0, wx.EXPAND),& (wx.Button(self, 6, '5'), 0, wx.EXPAND),& (wx.Button(self, 7, '6'), 0, wx.EXPAND),& (wx.Button(self, 8, '*'), 0, wx.EXPAND),& (wx.Button(self, 9, '1'), 0, wx.EXPAND),& (wx.Button(self, 10, '2'), 0, wx.EXPAND),& (wx.Button(self, 11, '3'), 0, wx.EXPAND),& (wx.Button(self, 12, '-'), 0, wx.EXPAND),& (wx.Button(self, 13, '0'), 0, wx.EXPAND),& (wx.Button(self, 14, '.'), 0, wx.EXPAND),& (wx.Button(self, 15, '='), 0, wx.EXPAND),& (wx.Button(self, 16, '+'), 0, wx.EXPAND)])& sizer.Add(gs, 1, wx.EXPAND)& self.SetSizer(sizer)& self.Centre()& wx.EVT_BUTTON(self, 20, self.OnClear)& wx.EVT_BUTTON(self, 21, self.OnBackspace)& wx.EVT_BUTTON(self, 22, self.OnClose)& wx.EVT_BUTTON(self, 1, self.OnSeven)& wx.EVT_BUTTON(self, 2, self.OnEight)& wx.EVT_BUTTON(self, 3, self.OnNine)& wx.EVT_BUTTON(self, 4, self.OnDivide)& wx.EVT_BUTTON(self, 5, self.OnFour)& wx.EVT_BUTTON(self, 6, self.OnFive)& wx.EVT_BUTTON(self, 7, self.OnSix)& wx.EVT_BUTTON(self, 8, self.OnMultiply)& wx.EVT_BUTTON(self, 9, self.OnOne)& wx.EVT_BUTTON(self, 10, self.OnTwo)& wx.EVT_BUTTON(self, 11, self.OnThree)& wx.EVT_BUTTON(self, 12, self.OnMinus)& wx.EVT_BUTTON(self, 13, self.OnZero)& wx.EVT_BUTTON(self, 14, self.OnDot)& wx.EVT_BUTTON(self, 15, self.OnEqual)& wx.EVT_BUTTON(self, 16, self.OnPlus)& & def OnClear(self, event):& self.display.Clear()& def OnBackspace(self, event):& formula = self.display.GetValue()& self.display.Clear()& self.display.SetValue(formula[:-1])& def OnClose(self, event):& self.Close()& def OnDivide(self, event):& if self.formula:& return& self.display.AppendText('/')& def OnMultiply(self, event):& if self.formula:& return& self.display.AppendText('*')& def OnMinus(self, event):& if self.formula:& return& self.display.AppendText('-')& def OnPlus(self, event):& if self.formula:& return& self.display.AppendText('+')& def OnDot(self, event):& if self.formula:& return& self.display.AppendText('.')& def OnEqual(self, event):& if self.formula:& return& formula = self.display.GetValue()& self.formula = True& try:& self.display.Clear()& output = eval(formula)& self.display.AppendText(str(output))& except StandardError:& self.display.AppendText("Error")& def OnZero(self, event):& if self.formula:& self.display.Clear()& self.formula = False& self.display.AppendText('0')& def OnOne(self, event):& if self.formula:& self.display.Clear()& self.formula = False& self.display.AppendText('1')& def OnTwo(self, event):& if self.formula:& self.display.Clear()& self.formula = False& self.display.AppendText('2')& def OnThree(self, event):& if self.formula:& self.display.Clear()& self.formula = False& self.display.AppendText('3')& def OnFour(self, event):& if self.formula:& self.display.Clear()& self.formula = False& self.display.AppendText('4')& def OnFive(self, event):& if self.formula:& self.display.Clear()& self.formula = False& self.display.AppendText('5')& def OnSix(self, event):& if self.formula:& self.display.Clear()& self.formula = False& self.display.AppendText('6')& def OnSeven(self, event):& if self.formula:& self.display.Clear()& self.formula = False& self.display.AppendText('7')& def OnEight(self, event):& if self.formula:& self.display.Clear()& self.formula = False& self.display.AppendText('8')& def OnNine(self, event):& if self.formula:& self.display.Clear()& self.formula = False& self.display.AppendText('9')& & class MyApp(wx.App):& def OnInit(self):& frame = MyFrame(None, -1, "calculator.py")& frame.Show(True)& self.SetTopWindow(frame)& return True& app = MyApp(0)& app.MainLoop()&
我们输入的公式使用 python 的内置函数 eval 来处理。output = eval( formula )如果公式有错,就会显示一条错误信息。请注意我们是如何在 Bck 和 Close 按纽之间插入空白的。我们只是简单的在那放了一个空的 wx.StaticText。这是一个很常用的技巧。
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-

我要回帖

更多关于 window phone游戏 的文章

 

随机推荐