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

目录
相关文章
|
Python
Python基础教程(第3版)中文版 第12章 图形用户界面 (笔记)
Python基础教程(第3版)中文版 第12章 图形用户界面 (笔记)
252 1
|
数据可视化 算法 JavaScript
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
本文探讨了如何利用图论分析时间序列数据的平稳性和连通性。通过将时间序列数据转换为图结构,计算片段间的相似性,并构建连通图,可以揭示数据中的隐藏模式。文章介绍了平稳性的概念,提出了基于图的平稳性度量,并展示了图分区在可视化平稳性中的应用。此外,还模拟了不同平稳性和非平稳性程度的信号,分析了图度量的变化,为时间序列数据分析提供了新视角。
552 0
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
在Python中,`tkinter`是一个用于创建图形用户界面(GUI)的标准库。
在Python中,`tkinter`是一个用于创建图形用户界面(GUI)的标准库。
|
开发框架 Python
Python的`pygame`库用于2D游戏开发,涵盖图形、音频和输入处理。
【6月更文挑战第21天】Python的`pygame`库用于2D游戏开发,涵盖图形、音频和输入处理。要开始,先通过`pip install pygame`安装。基本流程包括:初始化窗口、处理事件循环、添加游戏元素(如玩家和敌人)、响应用户输入、更新游戏状态及结束条件。随着项目发展,可逐步增加复杂性。
801 1
|
存储 前端开发 人机交互
23.Python 图形化界面编程
23.Python 图形化界面编程
484 2
|
Python 容器
Python与GUI编程:创建图形用户界面
Python的Tkinter库是用于构建GUI应用的内置工具,无需额外安装。它提供了丰富的控件,如按钮、文本框等,让用户通过图形界面与程序交互。创建GUI窗口的基本步骤包括:导入Tkinter库,创建窗口对象,设置窗口属性,添加控件(如标签和按钮),并使用布局管理器(如`pack()`或`grid()`)来组织控件的位置。此外,可以通过绑定事件处理函数来响应用户操作,例如点击按钮。Tkinter还有更多高级功能,适合开发复杂GUI应用。
|
存储 数据可视化 算法
最新Python-Matplotlib可视化(9)——精通更多实用图形的绘制,2024年最新小米面试题库
最新Python-Matplotlib可视化(9)——精通更多实用图形的绘制,2024年最新小米面试题库
最新Python-Matplotlib可视化(9)——精通更多实用图形的绘制,2024年最新小米面试题库
|
数据可视化 Linux 数据格式
`seaborn`是一个基于`matplotlib`的Python数据可视化库,它提供了更高级别的接口来绘制有吸引力的和信息丰富的统计图形。`seaborn`的设计目标是使默认图形具有吸引力,同时允许用户通过调整绘图参数来定制图形。
`seaborn`是一个基于`matplotlib`的Python数据可视化库,它提供了更高级别的接口来绘制有吸引力的和信息丰富的统计图形。`seaborn`的设计目标是使默认图形具有吸引力,同时允许用户通过调整绘图参数来定制图形。
`matplotlib`是Python中一个非常流行的绘图库,它提供了丰富的绘图接口,包括二维和三维图形的绘制。`Axes3D`是`matplotlib`中用于创建三维坐标轴的对象,而`plot_surface`则是用于在三维空间中绘制表面的函数。
`matplotlib`是Python中一个非常流行的绘图库,它提供了丰富的绘图接口,包括二维和三维图形的绘制。`Axes3D`是`matplotlib`中用于创建三维坐标轴的对象,而`plot_surface`则是用于在三维空间中绘制表面的函数。
|
Java Python
分别使用python和java编写金字塔图形
分别使用python和java编写金字塔图形
201 0

推荐镜像

更多