[PYTHON] 核心编程笔记(19.图形用户界面编程)

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介:

19.1 简介


19.1.1 什么是Tcl,Tk和Tkinter?


19.1.2 安装和使用Tkinter


# apt-get install python-tk -y


# python

-------------------------------

Python 2.7.3 (default, Sep 26 2012, 21:51:14)

[GCC 4.7.2] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> import Tkinter

>>>

--------------------------------


19.2 Tkinter与Python编程


19.2.1 Tkinter模块:把Tk引入您的程序

1.导入Tkinter模块(import Tkinter,或者,from Tkinter import *)

2.创建一个顶层窗口对象,来容纳您的整个GUI程序

3.在您顶层窗口对象上或其中创建所有的GUI模块(以及功能)

4.把这些GUI模块与地层程序代码相连接

5.进入主事件循环


第一步很明显,所有使用Tkinter的GUI程序必须先导入Tkinter模块,第一步就是为


了获得Tkinter的访问权


19.2.2 GUI程序开发简介


19.2.3 顶层窗口:Tkinter.Tk()


>>> import Tkinter

>>> top = Tkinter.Tk()


19.2.4 Tk组件


例,标签组件演示(tkhello1.py)

# vi tkhello1.py

----------------------------

#!/usr/bin/env python


import Tkinter


top = Tkinter.Tk()

label = Tkinter.Label(top, text = 'Hello World!')

label.pack()

Tkinter.mainloop()

----------------------------


19.3 Tkiner 举例


19.3.1 标签组件


19.3.2 按钮组件


例,按钮组件演示

# vi tkhello2.py

------------------------------

#!/usr/bin/env python


import Tkinter


top = Tkinter.Tk()

quit = Tkinter.Button(top, text = 'Hello World!', command = top.quit)

quit.pack()

Tkinter.mainloop()

------------------------------


19.3.3 标签和按钮组件


例,标签和按钮组件演示

# vi tkhello3.py

------------------------------

#!/usr/bin/env python


import Tkinter


top = Tkinter.Tk()

hello = Tkinter.Label(top, text='Hello World!')

hello.pack()


quit = Tkinter.Button(top, text='QUIT',

     command=top.quit, bg='red',fg='white')

quit.pack(fill=Tkinter.X, expand=1)

Tkinter.mainloop()

------------------------------


19.3.4 标签,按钮和进度条组件


例,标签,按钮和进度条组件演示


我们最后一个组件例子介绍进度条组件,重点放在组件间通过回调函数的交互[诸


如resize()],您对进度条组件的动作将影响标签组件上的文字


# vi tkhello4.py

------------------------------------

#!/usr/bin/env python


from Tkinter import *


def resize(ev=None):

   label.config(font='Helvetica -%d bold' % \

       scale.get())


top = Tk()

top.geometry('250x150')


label = Label(top, text='Hello World!',

   font='Helvetica -12 bold')

label.pack(fill=Y, expand=1)


scale = Scale(top, from_=10, to=40,

   orient=HORIZONTAL, command=resize)

scale.set(12)

scale.pack(fill=X, expand=1)


quit = Button(top, text='QUIT',

   command=top.quit, activeforeground='white',

   activebackground='red')

quit.pack()


mainloop()


------------------------------------


19.3.5 偏函数应用举例


例,运用PFA的路灯指示牌GUI程序

# vi pfaGUI2.py

--------------------------------------

#!/usr/bin/env python


from functools import partial as pto

from Tkinter import Tk, Button, X

from tkMessageBox import showinfo, showwarning, showerror


WARN = 'warn'

CRIT = 'crit'

REGU = 'regu'


SIGNS = {

   'do not enter': CRIT,

   'railroad crossing': WARN,

   '55\nspeed limit': REGU,

   'wrong way': CRIT,

   'merging traffic': WARN,

   'one way': REGU,

}


critCB = lambda : showerror('Error', 'Error Button Pressed!')

warnCB = lambda : showwarning('Warning',

   'Warning Button Pressed!')

infoCB = lambda : showinfo('Info', 'Info Button Pressed!')


top = Tk()  

top.title('Road Signs')

Button(top, text='QUIT', command=top.quit,

   bg='red', fg='white').pack()


MyButton = pto(Button, top)

CritButton = pto(MyButton, command=critCB, bg='white', fg='red')

WarnButton = pto(MyButton, command=warnCB, bg='goldenrod1')

ReguButton = pto(MyButton, command=infoCB, bg='white')


for eachSign in SIGNS:

   signType = SIGNS[eachSign]

   cmd = '%sButton(text=%r%s).pack(fill=X, expand=True)' % (

       signType.title(), eachSign,

       '.upper()' if signType == CRIT else '.title()')

   eval(cmd)


top.mainloop()

--------------------------------------


19.3.6 中级Tkinter范例


例,文件遍历系统(listdir.py)


这个稍高级一些的GUI程序扩大的组件的使用范围,演员名单新增了列表框,文本框


,和滚动条,而且还有大量的回调函数,例如鼠标点击,键盘输入,和滚动条操作


# vi listdir.py

----------------------------------------

#!/usr/bin/env python


import os

from time import sleep

from Tkinter import *


class DirList:


   def __init__(self, initdir=None):

       self.top = Tk()

       self.label = Label(self.top, \

           text='Directory Lister' + ' v1.1')

       self.label.pack()


       self.cwd=StringVar(self.top)


       self.dirl = Label(self.top, fg='blue',

           font=('Helvetica', 12, 'bold'))

       self.dirl.pack()


       self.dirfm = Frame(self.top)

       self.dirsb = Scrollbar(self.dirfm)

       self.dirsb.pack(side=RIGHT, fill=Y)

       self.dirs = Listbox(self.dirfm, height=15, \

           width=50, yscrollcommand=self.dirsb.set)

       self.dirs.bind('<Double-1>', self.setdirandgo)

       self.dirsb.config(command=self.dirs.yview)

       self.dirs.pack(side=LEFT, fill=BOTH)

       self.dirfm.pack()


       self.dirn = Entry(self.top, width=50, \

           textvariable=self.cwd)

       self.dirn.bind('<Return>', self.dols)

       self.dirn.pack()


       self.bfm = Frame(self.top)

       self.clr = Button(self.bfm, text='Clear', \

           command=self.clrdir, \

           activeforeground='white', \

           activebackground='blue')

       self.ls = Button(self.bfm, \

           text='List Directory', \

           command=self.dols, \

           activeforeground='white', \

           activebackground='green')

       self.quit = Button(self.bfm, text='Quit', \

           command=self.top.quit, \

           activeforeground='white', \

           activebackground='red')

       self.clr.pack(side=LEFT)

       self.ls.pack(side=LEFT)

       self.quit.pack(side=LEFT)

       self.bfm.pack()


       if initdir:

           self.cwd.set(os.curdir)

           self.dols()


   def clrdir(self, ev=None):

       self.cwd.set('')


   def setdirandgo(self, ev=None):

       self.last = self.cwd.get()

       self.dirs.config(selectbackground='red')

       check = self.dirs.get(self.dirs.curselection())

       if not check:

           check = os.curdir

       self.cwd.set(check)

       self.dols()


   def dols(self, ev=None):

       error = ''

       tdir = self.cwd.get()

       if not tdir: tdir = os.curdir


       if not os.path.exists(tdir):

           error = tdir + ': no such file'

       elif not os.path.isdir(tdir):

           error = tdir + ': not a directory'


       if error:

           self.cwd.set(error)

           self.top.update()

           sleep(2)

           if not (hasattr(self, 'last') \

and self.last):

   self.last = os.curdir

           self.cwd.set(self.last)

           self.dirs.config( \

selectbackground='LightSkyBlue')

           self.top.update()

           return


       self.cwd.set( \

   'FETCHING DIRECTORY CONTENTS...')

       self.top.update()

       dirlist = os.listdir(tdir)

       dirlist.sort()

       os.chdir(tdir)

       self.dirl.config(text=os.getcwd())

       self.dirs.delete(0, END)

       self.dirs.insert(END, os.curdir)

       self.dirs.insert(END, os.pardir)

       for eachFile in dirlist:

           self.dirs.insert(END, eachFile)

       self.cwd.set(os.curdir)

       self.dirs.config( \

   selectbackground='LightSkyBlue')


def main():

   d = DirList(os.curdir)

   mainloop()


if __name__ == '__main__':

   main()

----------------------------------------


19.4 其他GUI简介


19.4.1 Tk interface eXtensions(Tix)


# apt-get install tix -y

# vi animalTix.pyw

-------------------------------------------

#!/usr/bin/env python


from Tkinter import Label, Button, END

from Tix import Tk, Control, ComboBox


top = Tk()

top.tk.eval('package require Tix')


lb = Label(top,

   text='Animals (in pairs; min: pair, max: dozen)')

lb.pack()


ct = Control(top, label='Number:',

   integer=True, max=12, min=2, value=2, step=2)

ct.label.config(font='Helvetica -14 bold')

ct.pack()


cb = ComboBox(top, label='Type:', editable=True)

for animal in ('dog', 'cat', 'hamster', 'python'):

   cb.insert(END, animal)

cb.pack()


qb = Button(top, text='QUIT',

   command=top.quit, bg='red', fg='white')

qb.pack()


top.mainloop()


-------------------------------------------


19.4.2 Python MegaWidgets(PMW)


19.4.3 wxWidgets和wxPython


Pmw GUI程序演示

# apt-get install python-pmw -y

# vi animalPmw.pyw

----------------------------------

#!/usr/bin/env python


from Tkinter import Button, END, Label, W

from Pmw import initialise, ComboBox, Counter


top = initialise()


lb = Label(top,

   text='Animals (in pairs; min: pair, max: dozen)')

lb.pack()


ct = Counter(top, labelpos=W, label_text='Number:',

   datatype='integer', entryfield_value=2,

   increment=2, entryfield_validate={'validator':

   'integer', 'min': 2, 'max': 12})

ct.pack()


cb = ComboBox(top, labelpos=W, label_text='Type:')

for animal in ('dog', 'cat', 'hamster', 'python'):

   cb.insert(END, animal)

cb.pack()


qb = Button(top, text='QUIT',

   command=top.quit, bg='red', fg='white')

qb.pack()


top.mainloop()


----------------------------------


wxPython GUI程序演示


# vi animalWx.pyw

-----------------------------------

#!/usr/bin/env python


from Tkinter import Button, END, Label, W

from Pmw import initialise, ComboBox, Counter


top = initialise()


lb = Label(top,

   text='Animals (in pairs; min: pair, max: dozen)')

lb.pack()


ct = Counter(top, labelpos=W, label_text='Number:',

   datatype='integer', entryfield_value=2,

   increment=2, entryfield_validate={'validator':

   'integer', 'min': 2, 'max': 12})

ct.pack()


cb = ComboBox(top, labelpos=W, label_text='Type:')

for animal in ('dog', 'cat', 'hamster', 'python'):

   cb.insert(END, animal)

cb.pack()


qb = Button(top, text='QUIT',

   command=top.quit, bg='red', fg='white')

qb.pack()


top.mainloop()


-----------------------------------


19.4.4 GTK+ 和 PyGTK


PyGTk GUI 程序演示(animalGtk.pyw)

# vi animalGtk.pyw

--------------------------------------

#!/usr/bin/env python


import pygtk

pygtk.require('2.0')

import gtk

import pango


class GTKapp(object):

   def __init__(self):

   top = gtk.Window(gtk.WINDOW_TOPLEVEL)

   top.connect("delete_event", gtk.main_quit)

   top.connect("destroy", gtk.main_quit)

   box = gtk.VBox(False, 0)

   lb = gtk.Label(

       'Animals (in pairs; min: pair, max: dozen)')

   box.pack_start(lb)


   sb = gtk.HBox(False, 0)

   adj = gtk.Adjustment(2, 2, 12, 2, 4, 0)

   sl = gtk.Label('Number:')

   sl.modify_font(

       pango.FontDescription("Arial Bold 10"))

   sb.pack_start(sl)

   ct = gtk.SpinButton(adj, 0, 0)

   sb.pack_start(ct)

   box.pack_start(sb)


   cb = gtk.HBox(False, 0)

   c2 = gtk.Label('Type:')

   cb.pack_start(c2)

   ce = gtk.combo_box_entry_new_text()

   for animal in ('dog', 'cat', 'hamster', 'python'):

       ce.append_text(animal)

   cb.pack_start(ce)

   box.pack_start(cb)


   qb = gtk.Button("")

   red = gtk.gdk.color_parse('red')

   sty = qb.get_style()

   for st in (gtk.STATE_NORMAL,

       gtk.STATE_PRELIGHT, gtk.STATE_ACTIVE):

       sty.bg[st] = red

   qb.set_style(sty)

   ql = qb.child

   ql.set_markup('<span color="white">QUIT</span>')

   qb.connect_object("clicked",

       gtk.Widget.destroy, top)

   box.pack_start(qb)

   top.add(box)

   top.show_all()


if __name__ == '__main__':

   animal = GTKapp()

   gtk.main()


--------------------------------------


19.5 相关模块和其他GUI

GUI 模块或系统描述

TkinterTK INTERface:     Python的默认GUI工具集

PmwPython                MegaWidgets(Tkinter扩展)

TixTk                    Interface eXtension(Tk 扩展)

TkZinc(Zinc)             Extended Tk Canvas type(Tk 扩展)

EasyGUI(easygui)         非常简单的非事件驱动GUI(Tk 扩展)

TIDE+(IDE Studio)        Tix集成开发环境


wxWidgets相关模块

wxPython                Python对wxWidgets的绑定,一个跨平台的GUI框架库(早期称为wxWindows)

Boa                     ConstructorPython集成开发环境兼wxPython GUI构造工具

PythonCard              基于wxPython的GUI桌面应用程序工具集

wxGlade                 另一个wxPython GUI设计工具


商业软件

win32ui                Python版的Microsoft MFC

swing                  Python版的Sun Microsystems Java/swing(基于Jython)







     本文转自 showerlee 51CTO博客,原文链接:http://blog.51cto.com/showerlee/1347183,如需转载请自行联系原作者

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
打赏
0
0
0
0
347
分享
相关文章
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
103 80
|
7天前
|
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
29 14
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
53 2
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
152 59
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
48 10
Python 语言:强大、灵活与高效的编程之选
本文全面介绍了 Python 编程语言,涵盖其历史、特点、应用领域及核心概念。从 1989 年由 Guido van Rossum 创立至今,Python 凭借简洁的语法和强大的功能,成为数据科学、AI、Web 开发等领域的首选语言。文章还详细探讨了 Python 的语法基础、数据结构、面向对象编程等内容,旨在帮助读者深入了解并有效利用 Python 进行编程。
探索Python编程的奥秘
在数字世界的海洋中,Python如同一艘灵活的帆船,引领着无数探险者穿梭于数据的波涛之中。本文将带你领略Python编程的魅力,从基础语法到实际应用,一步步揭开Python的神秘面纱。
45 12
Python编程入门:打造你的第一个程序
迈出编程的第一步,就像在未知的海洋中航行。本文是你启航的指南针,带你了解Python这门语言的魅力所在,并手把手教你构建第一个属于自己的程序。从安装环境到编写代码,我们将一步步走过这段旅程。准备好了吗?让我们开始吧!
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等