20161111 Python 读书笔记之界面设计

图形用户界面

使用GUI工具包 ----wxPython

1.安装wxPython

   测试网址 http://www.crifan.com/wxpython_download_and_install_and_try_it/

一个小栗子

!/usr/bin/env python
----------------------------------------------------------------------------
Name:         test7.py
Purpose:      A minimal wxPython test program

Author:       Guo Hang

Created:      A long time ago, in a galaxy far, far away...
Copyright:    (c) 2016 by XJTUSE
Licence:      wxWidgets license
----------------------------------------------------------------------------

NOTE: this sample requires wxPython 2.6 or newer

import the wxPython GUI package
import wx


# Create a new frame class, derived from the wxPython Frame.
class MyFrame(wx.Frame):

    def __init__(self, parent, id, title):
        # First, call the base class' __init__ method to create the frame
        wx.Frame.__init__(self, parent, id, title)

        # Associate some events with methods of this class
        self.Bind(wx.EVT_SIZE, self.OnSize)
        self.Bind(wx.EVT_MOVE, self.OnMove)

        # Add a panel and some controls to display the size and position
        panel = wx.Panel(self, -1)
        label1 = wx.StaticText(panel, -1, "Size:")
        label2 = wx.StaticText(panel, -1, "Pos:")
        self.sizeCtrl = wx.TextCtrl(panel, -1, "", style=wx.TE_READONLY)
        self.posCtrl = wx.TextCtrl(panel, -1, "", style=wx.TE_READONLY)
        self.panel = panel

        # Use some sizers for layout of the widgets
        sizer = wx.FlexGridSizer(2, 2, 5, 5)
        sizer.Add(label1)
        sizer.Add(self.sizeCtrl)
        sizer.Add(label2)
        sizer.Add(self.posCtrl)

        border = wx.BoxSizer()
        border.Add(sizer, 0, wx.ALL, 15)
        panel.SetSizerAndFit(border)
        self.Fit()


    # This method is called by the System when the window is resized,
    # because of the association above.
    def OnSize(self, event):
        size = event.GetSize()
        self.sizeCtrl.SetValue("%s, %s" % (size.width, size.height))

        # tell the event system to continue looking for an event handler,
        # so the default handler will get called.
        event.Skip()

    # This method is called by the System when the window is moved,
    # because of the association above.
    def OnMove(self, event):
        pos = event.GetPosition()
        self.posCtrl.SetValue("%s, %s" % (pos.x, pos.y))




# Every wxWidgets application must have a class derived from wx.App
class MyApp(wx.App):

    # wxWindows calls this method to initialize the application
    def OnInit(self):

        # Create an instance of our customized Frame class
        frame = MyFrame(None, -1, "This is a test")
        frame.Show(True)

        # Tell wxWindows that this is our main window
        self.SetTopWindow(frame)

        # Return a success flag
        return True



app = MyApp(0)     # Create an instance of the application class
app.MainLoop()     # Tell it to start processing events
第一个例子
开始需要导入wx模块:
编写wxPython程序的方法很多,但是不可避免的事情是创建应用程序对象。基本的应用程序类叫做ex.app,他负责幕后所有的初始化。
最简单的wxPython程序应该是下面这个杨总
# import wx
# app = wx.App()
# app.MainLoop()

例子中可以看到,wx包中的方法都是以打些字迷开头的,而这和Python的习惯是相反的。
窗口和组件
窗口也成为框架,他只是wx.Frame类的实例。wx框架中的部分都是由它们的父部件作为构造函数的第一个参数创建的。
在调用app.MainLoop前需要调用窗口的Show方法--否则他会一直隐藏

import wx
app = wx.App()
win = wx.Frame(None)
win.Show()
app.MainLoop()

#如果运行这个程序会出现一个窗口
#例子 在框架上增加按钮
import wx
app = wx.App()
win = wx.Frame(None)
btn = wx.Button(win)
win.Show()
app.MainLoop()
#当然到这里还不行,窗口没有标签,按钮没有标签,而且也不希望让按钮覆盖整个窗口
#标签、标题和位置  在创建部件的时候使用构造函数label参数设定他们的标签
#另外一个栗子 使用关键参数增加标签和标题
import wx
app = wx.App()
win = wx.Frame(None,title="Simple Editor")
loadButton = wx.Button(win,label="Open")
saveButton = wx.Button(win,label="Save")
win.Show()
app.MainLoop()
#使用pos和size参数在构造函数内设置位置和尺寸
改进的栗子 设置按钮位置
import wx
app = wx.App()
win = wx.Frame(None,title="Simple Editor",size=(410,335))
win.Show()

loadButton = wx.Button(win,label="Open",pos=(225,5),size=(80,25))

saveButton = wx.Button(win,label="Save",pos=(315,5),size=(80,25))

filename = wx.TextCtrl(win,pos=(5,5),size=(210,25))

contents = wx.TextCtrl(win,pos=(5,35),size=(390,260),style=wx.TE_MULTILINE | wx.HSCROLL)

app.MainLoop()
#看到了,位置和尺寸都包括一对数值:位置包括x和y坐标,而尺寸包括宽和高。
#创建了两个文本控件(text control,wx.TextCtrl对象),每个都使用自定义风格。默认的风格是文本框,就是一行可编辑的文本,没有滚动条,为了创建文本区
#只要使用style参数调整风格即可。style参数的值实际上是个整数,的你不用直接定义,可以使用按位或运算符OR联合wx模块中具有特殊名字的风格来指定。
#本例中我们联合了wx.TE_MULTILINE来获取多行文本区(默认有垂直滚动条)以及wx.HSCROLL来获取水平滚动条。
使用尺寸器
import wx
app = wx.App()
win = wx.Frame(None,title="Simple Editor",size=(410,335))
bkg = wx.Panel(win)

loadButton = wx.Button(bkg,label='Open')
saveButton = wx.Button(bkg,label='Save')
filename = wx.TextCtrl(bkg)
contents = wx.TextCtrl(bkg,style=wx.TE_MULTILINE | wx.HSCROLL)

hbox = wx.BoxSizer()
hbox.Add(filename,proportion=1,flag=wx.EXPAND)
hbox.Add(loadButton,proportion=0,flag=wx.LEFT,border=5)
hbox.Add(saveButton,proportion=0,flag=wx.LEFT,border=5)

vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(hbox,proportion=0,flag=wx.EXPAND | wx.ALL,border=5)
vbox.Add(contents,proportion=1,flag=wx.EXPAND | wx.LEFT | wx.BOTTOM | wx.RIGHT,border=5)

bkg.SetSizer(vbox)
win.Show()

app.MainLoop()
#wx.BoxSizer构造函数带有一个决定它是水平还是垂直的参数(wx.HORIZONTAL或者wx.VERTICAL),默认为水平。
#ADD方法有几个参数,proportion参数根据在窗口改变大小时分配空间设置比例。例如,水平的BoxSizer(第一个中)
#flag参数类似于构造函数中的style参数,可以使用按位或运算符链接构造符号常量对其进行构造。
#wx.EXPAND标记确保组件会扩展到所丰沛的空间中。而wx.LEFT、wx.RIGHT、wx.BOTTOM和wx.ALL标记决定参数框应用于那个边,边框参数用于设置边缘宽度。

事件处理

#假设写了一个一个负责打开文件的函数,并将其命名为load。然后就可以像下面这样将该函数作为loadButton的时间处理函数:
#loadButton.Bind(wx.EVT_BUTTON,load) #我把函数链接到了按钮--点击按钮的时候,函数被调用了。名为wx.EXT_BUTTON的符号常量表示一个按钮事件
import wx
def load(event):
    file = open(filename.GetValue())    #文件名使用filename对象的GetValue方法获取
    contents.SetValue(file.read())      #为了将文本引入文本区,只要用contents.SetValue
    file.close()

def save(event):
    file = open(filename.GetValue(),'w')
    file.write(contents.GetValue())     #GetValue()用于从文本区获取
    file.close()

app = wx.App()
win = wx.Frame(None,title="Simple Editor",size=(410,335))

bkg = wx.Panel(win)
loadButton = wx.Button(bkg,label='Open')
loadButton.Bind(wx.EVT_BUTTON,load)

saveButton = wx.Button(bkg,label='Save')
saveButton.Bind(wx.EVT_BUTTON,save)

filename = wx.TextCtrl(bkg)
contents = wx.TextCtrl(bkg,style=wx.TE_MULTILINE | wx.HSCROLL)

hbox = wx.BoxSizer()
hbox.Add(filename,proportion=1,flag=wx.EXPAND)
hbox.Add(loadButton,proportion=0,flag=wx.LEFT,border=5)
hbox.Add(saveButton,proportion=0,flag=wx.LEFT,border=5)

vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add(hbox,proportion=0,flag=wx.EXPAND | wx.ALL,border=5)
vbox.Add(contents,proportion=1,flag=wx.EXPAND | wx.LEFT | wx.BOTTOM | wx.RIGHT,border=5)
bkg.SetSizer(vbox)
win.Show()
app.MainLoop()

Python强大的GUI工具包 Tkinter和Jython/Swing

#一个简单的栗子
#这个例子时有一个窗口,这个窗口包含一个带有“Hello”标签的按钮。当点击按钮时,她会打印出文本"Hello,world!",
#为了简单,我们没有使用任何的布局特性
import wx
def hello(event):
    print "Hello,world!"
app = wx.App()

win = wx.Frame(None,title="Hello,wxPython!",size=(200,100))
button = wx.Button(win,label="Hello")
button.Bind(wx.EVT_BUTTON,hello)
"""
Bind方法可以将事件处理函数链接到事件上,我们把函数连接到按钮上,当点击按钮的时候,函数被调用。
名为wx.EVT_BUTTON的符号常量表示一个按钮事件。
"""
win.Show()
app.MainLoop()
使用Tkinter
from Tkinter import *
def hello():
    print 'Hello,world'
win = Tk()  #Tkinter的主窗口
win.title('Hello,Tkinter!')
win.geometry('250x100') #Size 200,100

btn = Button(win,text='Hello',command=hello)
btn.pack(expand=YES,fill=BOTH)

mainloop()
使用Jython和Swing
#下面是使用Hython和Swing实现的GUI实例。
from javax,swing import *
import sys

def hello(event):
    print 'Hello,World!'
btn = JButton('button')
btn.actionPerformed = hello

win = JFrame('Hello,Swing!')
win.contentPane.add(btn)

def closeHarndler(event):
    sys.exit()
win.windowClosing = closeHarndler

btn.size = win.size = 200,100
win.show()

#小节
#图形用户界面(GUI).GUI可以让程序更友好。虽然并不是所有的程序都需要他们,但是当程序需要交互的时候,GUI可能会有所帮助。
#Python的GUI平台。Python程序员有很多GUI平台可用。尽管有这么多选择是好事,但是选择是会很困难。
#wxPython。wxPython是已成熟的并且特色丰富的跨平台的PythonGUI工具包。
#布局。通过指定几何坐标,可以直接将组件放置在想要的位置。但是为了在包含他们的窗口改变大小时所做出适当的改变,需要使用布局管理器。wxpython的布局管理机制是尺寸器。
#事件处理。用户的动作触发GUI工具包的事件。任何应用中,程序都会对于这样的事件作出反应,否则用户就没法和程序交互了。 wxPython中事件处理函数使用Bind方法添加到组件上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值