枫叶飞翔 发表于 2018-8-3 10:45:31

Python之Tkinter:动作

  Python之Tkinter:动作
进行界面编程,首先少不了以下几个重要部分:
l窗体
l控件
l动作
  窗体是容器,各式各样的控件放置在容器中,每种控件在触发之后都会执行一定的指令,即完成它的动作。
  怎样将控件绑定到一个命令上?一般来说在创建控件的时候,使用参数command来指定要执行的动作,这个动作可以使以下几类情况:
  l普通函数
  l同属于一个类的其他成员函数
  l内置函数
  llamda函数
  怎样创建窗口?一般来说有这么几种方法,一种是过程式的,使用Tk()。还有一种是面向对象式的,即:继承自Frame. Tk()返回的对象是根容器,Frame产生的对象可以放置在Tk()返回的对象中。
  每个窗口在创建之后,使用pack对自己进行布局,并使自己可见。布局的方式可以使用expand、fill、side等。
  控件对事件的绑定调用函数bind,第一个参数为表示事件的字符串,第二个为要执行的动作,动作的来源前面已经叙述。
  下面为一些例子:
  


[*]#!/usr/bin/python
[*]
[*]
[*]
[*]from Tkinter import *
[*]
[*]
[*]
[*]def quit():
[*]
[*]         print "I have to leave now ..."
[*]
[*]         import sys
[*]
[*]         sys.exit()
[*]
[*]
[*]
[*]b = Button(None,text="quit",bg="red",command=quit)
[*]
[*]b.pack()
[*]
[*]b.mainloop()
[*]
[*]
  

  创建一个Button,点击后执行的动作为退出。
  


[*]#!/usr/bin/python
[*]
[*]
[*]
[*]from Tkinter import *
[*]
[*]
[*]
[*]class ClassCall():
[*]
[*]         def __init__(self):
[*]
[*]                   self.msg="call from a class.\n"
[*]
[*]         def __call__(self):
[*]
[*]                   print self.msg
[*]
[*]                   import sys
[*]
[*]                   sys.exit()
[*]
[*]
[*]
[*]widget = Button(None,text="test",command=ClassCall())
[*]
[*]widget.pack()
[*]
[*]widget.mainloop()
  

  将一个类的实例指定为动作,默认时调用该类的__call__方法。
  


[*]#!/usr/bin/python
[*]
[*]
[*]
[*]from Tkinter import *
[*]
[*]
[*]
[*]class InnerClass():
[*]
[*]         def __init__(self):
[*]
[*]                   self.b = Button(None,text="test",command = self.call)
[*]
[*]                   self.b.pack()
[*]
[*]         def call(self):
[*]
[*]                   print "I am leaving now..."
[*]
[*]                   import sys
[*]
[*]                   sys.exit()
[*]
[*]
[*]
[*]InnerClass()
[*]
[*]mainloop()
[*]
[*]
  

  调用同一个类内部的成员函数
  


[*]
[*]
[*]#!/usr/bin/python
[*]
[*]
[*]
[*]from Tkinter import *
[*]
[*]
[*]
[*]class GuiDesign():
[*]
[*]         def __init__(self,parent=None):
[*]
[*]                   self.top = Frame(parent)
[*]
[*]                   self.top.pack()
[*]
[*]                   self.data = 0
[*]
[*]                   self.layout()
[*]
[*]
[*]
[*]         def layout(self):
[*]
[*]                   Button(self.top,text="exit",command=self.top.quit).pack(side = LEFT)
[*]
[*]                   Button(self.top,text="hi",command=self.hi).pack(side = RIGHT)
[*]
[*]
[*]
[*]         def hi(self):
[*]
[*]                   self.data += 1
[*]
[*]                   print "hi:%d" % self.data
[*]
[*]
[*]
[*]frm = Frame()
[*]
[*]frm.pack()         #easy to make mistake here.
[*]
[*]Label(frm,text="hello").pack(side=TOP)
[*]
[*]GuiDesign(frm).top.mainloop()
[*]
[*]
  

  将Frame对象作为参数使用
  


[*]#!/usr/bin/python
[*]
[*]
[*]
[*]from Tkinter import *
[*]
[*]
[*]
[*]def showPosEvent(event):
[*]
[*]    print 'Widget=%s X=%s Y=%s' % (event.widget, event.x, event.y)
[*]
[*]    print 'Got key perss:',event.char
[*]
[*]
[*]
[*]
[*]
[*]tkroot = Tk()
[*]
[*]labelfont = ('courier', 20, 'bold')
[*]
[*]widget = Label(tkroot, text='Hello bind world')
[*]
[*]widget.config(bg='red', font=labelfont)
[*]
[*]widget.config(height=5, width=20)
[*]
[*]widget.pack(expand=YES, fill=BOTH)
[*]
[*]
[*]
[*]widget.bind('<KeyPress>',showPosEvent)
[*]
[*]widget.focus()
[*]
[*]tkroot.title('Click Me')
[*]
[*]tkroot.mainloop()
  

  响应按键事件,以及动态配置控件的方式
页: [1]
查看完整版本: Python之Tkinter:动作