python如何做图形化界面,python好看的图形化界面

大家好,小编为大家解答python图形化编程工具哪个好的问题。很多人还不知道python如何做图形化界面,现在让我们一起来看看吧!

Source code download: 本文相关源码

Python 提供了大量的 GUI 库,可用于创建功能丰富的图形用户界面。这些 GUI 库大部分是第三方提供的python如何画九朵花。可选择熟悉的 GUI 库或者直接选择 Python 内置的 Tkinter 库开发图形界面程序。

图形用户组件以一种“搭积木”的方式组织在一起,成为实际可用的图形用户界面。图形用户界面还需要与用户交互操作,还应该为程序提供事件处理,事件处理负责让程序响应用户动态。

一、 Python 的 GUI 库

图形用户界面(Graphics User Interface),简称 GUI。

Python 的图形用户界面库有下面这些:

(1)、PyGObject:PyGObject 库为基于 GObject 的 C 函数库提供了内省绑定,这些库可以支持 GTK+3 图形界面工具集,因此 PyGObject 提供了丰富的图形界面组件。

(2)、PyGTK:PyGTK 基于老版本的 GTK+2 的库提供绑定,借助于底层 GTK+2 所提供的各种可视化元素和组件,同样可以开发出在 GNOME 桌面系统上运行的软件,因此它主要适用于 Linux/Unix 系统。PyGTK 对 GTK+2 的 C 语言进行了简单封装,提供了面向对象的编程接口。参考网址 https://wiki.python.org/moin/PyGtk。

(3)、PyQt:PyQt 是 Python 编程语言和 Qt 库的成功融合。Qt 本身是一个扩展的 C++ GUI 应用开发框架,Qt 可以在 UNIX、Windows 和 Mac OS X 上完美运行,因此 PyQt 是建立在 Qt 基础上的 Python 包装。所以,PyQt 也能跨平台使用。

(4)、PySide:PySide 是由 Nokia 提供的对 Qt 工具集的新的包装库,其成熟度不如 PyQt。

(5)、wxPython:wxPython 是一个跨平台的 GUI 工具集,wxPython 以流行的 wxWidgets(原名 wxWindowss)为基础,提供了良好的跨平台外观。wxPython 在 Windows 上调用 Windows 的本地组件、在 MacOS 上调用 Mac OS X 的本地组件、在 Linux 上调用 Linux 的本地组件,这样可以让 GUI 程序在不同的平台上显示平台对应的风格。wxPython 是一个非常流行的跨平台的 GUI 库。官方 网址是 http://www.wxpython.org。

可根据需要选择上面的 Python GUI 库做图形用户界面开发。如果需要开发跨平台的图形用户界面,则推荐使用 PyQt 或 wxPython。

这里使用的 GUI 库 Tkinter,它是 Python 自带的 GUI 库,直接导入 tkinter 包即可使用。

二、Tkinter GUI 编程的组件

可将一个窗口看成可被分解的一个空的容器,容器里装了大量的基本组件,通过设置这些基本组件的大小、位置等属性,就可以将该空的容器和基本组件组成一个整体的窗口。所以,可将图形界面编程看作是拼图游戏,创建图形用户界面的过程就是完成拼图的过程。

学习 GUI 编程的总体步骤可分为下面三步:

(1)、了解 GUI 库大致包含哪些组件,就相当于熟悉每个积木块到底是些什么东西。

(2)、掌握容器及容器对组件进行布局的方法。

(3)、逐个掌握各组件的用法,则相当于深入掌握每个积木块的功能和用法。

由于 Tkinter 库包含的 GUI 组件较多,且各组件之间存在错综复杂的继承关系。需要先通过类图来了解各 GUI 组件,以及它们之间的关系。Tkinter 的 GUI 组件之间的继承关系如图一所示。

1501522-20200110160006565-1408839378.png

图一  Tkinter 的 GUI 组件之间的继承关系.png

图一 Tkinter 的 GUI 组件之间的继承关系

从上图可以看到,Tkinter 的 GUI 组件有两个根父类,它们都直接继承了 object 类。

(1)、Misc:它是所有组件的根父类。

(2)、Wm:它主要提供了一些与窗口管理器通信的功能函数。

对于 Misc 和 Wm 两个基类而言,GUI 编程并不需要直接使用它们,但由于它们是所有 GUI 组件的父类,因此 GUI 组件都可以直接使用它们的方法。

Misc 和 Wm 派生了一个子类:Tk,它代表应用程序的主窗口。因此,所有 Tkinter GUI 编程通常都需要直接或间接使用该窗口类。

BaseWidget 是所有组件的基类,它还派生了一个子类:Widget。Widget 代表一个通用的 GUI 组件。Tkinter 所有的 GUI 组件都是Widget 的子类。

Widget 的父类有四个,除 BaseWidget 之外,还有 Pack、Place 和 Grid,这三个父类都是布局管理器,它们负责管理所包含的组件的大小和位置。

剩下的是图一右边的 Widget 的子类,这些都是 Tkinter GUI 编程的各种 UI 组件,也就是“积木块”。下面是 GUI 组件功能的简单介绍。

Tkinter类名称简介

Toplevel

顶层

容器类,可用于为其他组件提供单独的容器;Toplevel有点类似于窗口

Button

按钮

代表按钮组件

Canvas

画布

提供绘图功能,包括绘制直线、矩形、椭圆、多边形、位图等

Checkbutton

复选框

可供用户勾选的复选框

Entry

单行输入框

用户可输入内容

Frame

容器

用于装载其他GUI组件

Label

标签

用于显示不可编辑的文本或图标

LabelFrame

容器

也是容器组件,类似于Frame,但它支持添加标题

Listbox

列表框

列出多个选项,供用户选择

Menu

菜单

菜单组件

Menubutton

菜单按钮

用来包含菜单的按钮(包括下拉式、层叠式等)

OptionMenu

菜单按钮

Menubutton的子类,也代表菜单按钮,可通过按钮打开一个菜单

Message

消息框

类似于标签,但可以显示多行文本;后来当当Label也能显示多行文本后,该组件基本不会用到

Radiobutton

单选按钮

可供用户点选的单选按钮

Scale

滑动条

拖动滑块可设定起始值和结束值,可显示当前位置的精确值

Spinbox

微调选择器

用户可通过该组件的向上、向下箭头选择不同的值

Scrollbar

滚动条

用于为组件(文本域、画布、列表框、文本框)提供滚动功能

Text

多行文本框

显示多行文本

下面来创建一个简单的图形窗口,代码如下:

#在 Python 2.x 版本中使用下面这行导入#from Tkinter import *#在 Python 3.x 版本中使用下这行

from tkinter import *

#创建 Tk 对象,Tk 代表窗口

root =Tk()#设置窗口标题

root.title('窗口标题')#创建 Label 对象,第一个参数指定将该 Label 放入 root内

w = Label(root, text='hello tkinter!')#调用 pack 进行布局

w.pack()#启动主窗口

root.mainloop()

上面代码中创建了两个对象:Tk 和 Label。其中 Tk 代表顶级窗口,Label 代表一个简单的文本标签,因此需要指定将该 Label 放在哪个容器内。在这里创建 Label 时第一个参数指定了 root,表明该 Label 要放入 root 窗口内。运行结果省略。

此外,还有一种方式是不直接使用 Tk,只要创建 Frame 的子类,它的子类就会自动创建 Tk对象作为窗口。示例如下:

from tkinter import *

# 定义一个继承 Frame 类的 Application 类

class Application(Frame):

def __init__(self, master=None):

Frame.__init__(self, master)

self.pack() # 布局

# 调用 initWidgets() 方法初始化界面

self.initWidgets()

def initWidgets(self):

# 创建 Label 对象,第一个参数指定将 Label 放和 root 内

w = Label(self)

# 创建一个位图

bm = PhotoImage(file = 'baidu.png')

# 必须用一个不会被释放的变量引用该图片,否则该图片会被回收

w.x = bm

# 设置显示的图片是 bm

w['image'] = bm

w.pack()

# 创建 Button 对象,第一个参数指定将该 Button 放入 root 内

okButton = Button(self, text="确定")

okButton['background'] = 'yellow'

# okButton.configure(background='yellow') # 这行与上面代码作用相同

okButton.pack()

# 创建 Application 对象

app = Application()

# Frame 有一个默认的 master 属性,该属性值是 Tk 对象(窗口)

print(type(app.master))

# 通过 master 属性来设置窗口标题

app.master.title("百度一下,啥都知到")

# 启动主窗口的消息循环

app.mai