Python图形用户界面

tkinter是Python中可用于构建GUI的众多工具集之一。

tkinter模块

# 可以使用import tkinter as tk并通过tk.thing去引用其中的内容
from tkinter import *

window = Tk()
window.mainloop()

以上代码可以显示一个空白的根窗口。可以将其看成是应用程序的最外层容器,创建其他插件(widget)的时候就需要用到它。如果关闭屏幕上的窗口,则相应的窗口对象就会被销毁。所有的应用程序都只有一个主窗口;此外,还可以通过TopLevel这个小插件来创建额外的窗口。

tkinter小插件包括Button, Canvas, Checkbutton, Entry, Frame, Label, Listbox, Menu, Message, Menubutton, Text, TopLevel等。

可变的变量

在Python中字符串、整数、浮点数以及布尔值都是不可变的,于是tkinter自带了一些类型;他们可以就地更新,并可以在其值发生变化时通知相关的插件。

tkinter中的可变类型

不可变类型 可变类型
int IntVar
string StringVar
bool BooleanVar
double DoubleVar

模型、视图、控制器

顾名思义,视图用于把信息显示给用户;模型则只是存储数据;控制器则可以更新应用程序的模型,并进而出发相应的视图发生变化。

如下例子实现点击按钮之后标签上的计数增加:

from tkinter import *

# The controller.
def click():
    counter.set(counter.get() + 1)

if __name__ == '__main__':
    # More initialization
    window = Tk()

    # The model.
    counter = IntVar()
    counter.set(0)

    # The views.
    frame = Frame(window)
    frame.pack()

    button = Button(frame, text='Click', command=click)
    button.pack()

    label = Label(frame, textvariable=counter)
    label.pack()

    window.mainloop()

使用Lambda

如果我们不仅希望能增加counter的值,还希望能降低它的值。则我们需要添加另一个按钮和另一个控制器函数。代码如下:

from tkinter import *

# The controller.
def click_up():
    counter.set(counter.get() + 1)

def click_down():
    counter.set(counter.get() - 1)

if __name__ == '__main__':
    # More initialization
    window = Tk()

    # The model.
    counter = IntVar()
    counter.set(0)

    # The views.
    frame = Frame(window)
    frame.pack()

    button = Button(frame, text='Up', command=click_up)
    button.pack()

    button = Button(frame, text='Down', command=click_down)
    button.pack()

    label = Label(frame, textvariable=counter)
    label.pack()

    window.mainloop()

上述实现代码看起来有点傻,click_upclick_down做的事情看起来几乎是一样的,应该将它们合成一个。这时,我们应该显示的把counter传递给函数,而不是使用全局变量。

# The model.
counter = IntVar()
counter.set(0)

# One controller with parameters
def click(variable, value):
    varaible.set(variable.get() + value)

tkinter要求由按钮(以及别的插件)出发的控制器函数不能含有参数,目的就是为了以同一种方式去调用它们。我们要做的事情就是:对这个带有两个参数的函数进行处理,使其变成一个不带参数的函数。

一个好一点的做法是使用lambda函数,它使我们能够创建一个没有名字的单行函数。

from tkinter import *
window = Tk()

# The model
counter = IntVar()
counter.set(0)

# General controller.
def click(var, value):
    var.set(var.get() + value)

# The views.
frame = Frame(window)
frame.pack()

button = Button(frame, text='Up', command=lambda: click(counter, 1))
button.pack()

button = Button(frame, text='Down', command=lambda: click(counter, -1))
button.pack()

label = Label(frame, textvariable=counter)
label.pack()

window.mainloop()

这段代码分别为两个按钮创建了一个不带参数的lambda函数,这两个lambda函数会将正确的值传进click。

样式

from tkinter import *
window = Tk()

# 字体
button = Button(window, text='hello', font=('Courier', 14, 'bold italic'))
# 布局
button.pack(side='left')

# 颜色
label = Label(window, text='hello', bg='green', fg='white')
label.pack()

window.mainloop()

控制布局,就可以使用pack,也可以使用grid,但是不能两者都用。

from tkinter import *
window = Tk()

button = Button(window, text='button1', font=('Courier', 14, 'bold italic'))
button.grid(row=0, column=0)

label = Label(window, text='label1', bg='green', fg='white')
label.grid(row=0, column=1)

label = Label(window, text='label2', bg='green', fg='white')
label.grid(row=1, column=1)

window.mainloop()

可以使用rowspan和columnspan设置插件所占据的行数,默认为1。

面向对象的GUI

几乎所有真实的GUI都是以类和对象来建造的:他们讲模型、视图和控制器一起放到一个干净整洁的包(package)中。例如下面的计数器函数,其模型是Counter类的一个名为self.state的成员变量,其控制器是upClickquitClick方法。

from tkinter import *

class Counter:
    '''A simple counter GUI using object-oriented programming.'''

    def __init__(self, parent):
        '''Create the GUI.'''

        # Framework.
        self.parent = parent
        self.frame = Frame(parent)
        self.frame.pack()

        # Model.
        self.state = IntVar()
        self.state.set(1)

        # Label displaying current state.
        self.label = Label(self.frame, textvariable=self.state)
        self.label.pack()

        # Buttons to control application.
        self.up = Button(self.frame, text='up', command=self.upClick)
        self.up.pack(side='left')

        self.right = Button(self.frame, text='quit', command=self.quitClick)
        self.right.pack(side='left')

    def upClick(self):
        '''Handle click on 'up' button.'''
        self.state.set(self.state.get() + 1)

    def quitClick(self):
        '''Handle click on 'quit' button.'''
        self.parent.destroy()

if __name__ == '__main__':
    window = Tk()
    myapp = Counter(window)
    window.mainloop()

参考资料:
《Python编程实践》
《Practical Programming An Introduction to Computer Science Using Python》

转载:http://blog.csdn.net/foreverling/article/details/44902547

时间: 2024-11-01 10:53:30

Python图形用户界面的相关文章

Camelot 11.11.16发布 Python图形用户界面框架

Camelot是一个Pythonhttp://www.aliyun.com/zixun/aggregation/18378.html">图形用户界面框架,用于快速构建桌面应用程序,只需简单添加一些额外信息到你的模型定义.Camelot是建立在SQLAlchemy和PyQt的基础上,由Django admin界面受启发而设计的.该框架包含自定义字段类型和图像编辑.电子邮件地址.丰富的文字,等等. Camelot 11.11.16该版本主要带来了新样式,使用迭代器在模式和GUI这间通信.添加一

《树莓派Python编程入门与实战》——2.3 使用Raspbian图形用户界面

2.3 使用Raspbian图形用户界面 树莓派Python编程入门与实战 默认情况下,当你启动树莓派并登录后会进入到Linux命令行.但是树莓派同样还有一个图形用户界面(GUI,Graphical User Interface). 为了打开图形界面,你需要在命令行键入startx并且回车.然后轻量级的X11桌面环境(LXDE,Lightweight X11 Desktop Environment)就启动了,你可以看到一个类似图2.1的图形界面. 提示: Linux桌面环境 一个关于Linux的

《树莓派Python编程入门与实战(第2版)》——2.3 使用Raspbian图形用户界面

2.3 使用Raspbian图形用户界面 默认情况下,当你启动树莓派并登录后会进入到Linux命令行.但是树莓派还有一个图形用户界面(GUI,Graphical User Interface). 为了打开图形化界面,你需要在命令行键入startx并且回车.然后轻量级的X11桌面环境(LXDE,Lightweight X11 Desktop Environment)就启动了,你可以看到一个如图2.1所示的图形化界面. TIP 提示:Linux桌面环境 Linux的好处之一,就是可以随意改变桌面环境

用户界面的视觉设计:图形用户界面(GUI)设计真实感

文章描述: 用户界面的视觉设计  用户界面的视觉设计的历史,可以描述成是一个逐渐向真实感变化的过程.就如同计算机已经变得越来越快一样,设计师增加了越来越多的现实的细节--比如色彩.立体效果.阴影.半透明甚至于简单的物理学原理.这些改变中有一部分已经帮助提高了界面的可用性.WINDOWS界面中窗口背后的阴影让我们知道哪个是当前窗口.iPhone手机用户界面的物理学体验令设备用起来更自然. 在其它领域,改善还值得商榷.图形用户界面(GUI)是最典型的例子.你在你的屏幕上看到的很多图形元素都是为了表达

嵌入式Linux系统图形及图形用户界面

本文首先概述了 Linux 图形领域的基本设施,然后描述了一些可供嵌入式 Linux 系统使用的高级图形库以及图形用户界面支持系统.希望对嵌入式 Linux 系统的开发有所帮助. 1 Linux 图形领域的基础设施 本小节首先向读者描述 Linux 图形领域中常见的基础设施.之所以称为基础 设施,是因为这些系统(或者函数库),一般作为其他高级图形或者图形应用程 序的基本函数库.这些系统(或者函数库)包括:X Window.SVGALib. FrameBuffer 等等. 1.1 X Window

用Swing编写灵敏的图形用户界面

不灵敏的图形用户界面会降低应用程序的可用性.当以下现象出现的时候,我们通常说这个用户界面反应不灵敏. 不响应事件的现象: 没有更新的现象: 这些现象在很大程度上与事件的处理方法相关,而在编写Swing应用程序的时候,我们几乎必然要编写方法去响应鼠标点击按钮,键盘回车等事件.在这些方法中我们要编写一些代码,在运行时去触发一些动作.常见动作包括查找,更新数据库等.在这篇文章中通过对一个实例的分析,介绍了一些基本概念,常见的错误以及提出了一个解决方案. event-dispatching thread

使用NetBeans进行J2ME开发(四):高级图形用户界面

本来我介绍完J2ME的低级图形界面Canvas就想直接跳到游戏开发API,但是为了内容的完整性,我决定还是把高级图形用户界面简单介绍一下.不过重点不一样,我不会很详细的将各个类怎么使用,我只是向大家演示一下NetBeans的可视化开发功能和高级图形用户界面在手机上的运行效果.让图片说话吧. 1.在项目中新建MIDlet的时候,选择Visual MIDlet,如下图: 2.弹出可视化设计界面,如下图:

使用NetBeans进行J2ME开发(三):低级图形用户界面Canvas

在这一篇中,我将向大家介绍图形用户界面中的低级图形用户界面.所谓低级图形用户界面,指的是那种我们可以自己在上面画图的控件,它是和TextBox,List等等这些用户控件刚好相对的概念,因为这些用户控件的形状是事先画好的,无需我们程序员操心,所以称为高级图形界面.低级图形用户界面什么东西都需要我们自己画,所以比较复杂,当然也更加灵活,只有想不到,没有画不出,所以我们先介绍它. 在J2ME开发中,低级图形用户界面是由javax.microedition.lcdui.Canvas类实现的,我们只要继承

AKFAvatar 0.21.2发布 有趣图形用户界面软件

AKFAvatar是一个文本信息导向的有趣http://www.aliyun.com/zixun/aggregation/18378.html">图形用户界面软件,它用一个头像显示在桌面上来给用户提示,还支持录制音频文件. 采用Lua编写,界面是由C++++.Free Pascal和GNU Pascal开发.提供一些准备使用的应用程序和模块,包括一个文本阅读器和模块来进行问题的答案练习. AKFAvatar 0.21.2版本设置 title/shortname再次运行,filechoose