Python中常用的几个GUI界面库:
Tkinter:
Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 。Tk 和 Tkinter可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tk8.0的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。这个库在Python3中是自带的。
wxPython:
wxPython 是一款开源软件,是 Python 语言的一套优秀的 GUI 图形库,允许 Python程序员很方便的创建完整的、功能键全的 GUI 用户界面。
安装:
先升级pip到最新版本:python3 -m pip install --upgrade pip;
然后使用pip工具安装wxPython:python3 -m pip install wxpython
Jython:
Jython是一种完整的语言,它是一个Python语言在Java中的完全实现。Jython也有很多从CPython中继承的模块库。最有趣的事情是Jython不像CPython或其他任何高级语言,它提供了对其实现语言的一切存取。所以Jython不仅给你提供了Python的库,同时也提供了所有的Java类。
在jython开发环境中,可以直接调用java.jar 包,就相当于用python开发过程中调用java的jar包。在java开发环境中,导入jython包(jar),可以在程序中执行原生的python脚本。
jython在java程序中是以jar包的形式存在;在python环境中,他就是pyhon环境+python的扩展,及支持调用jar包。
安装:
去官网上下载最新版本的jar包;
在该jar包所在目录按住shift键右键打开cmd窗口;
输入命令:java -jar jython-installer-2.7.0.jar安装(或者双击安装也可以)。注意安装类型选择all;
把jython.exe所在目录C:\jython2.7.0\bin加入系统变量中,然后打开cmd,输入jython。
出现上面的界面表示安装成功。Python中能使用的命令在jython中都可以使用,也可以使用pip工具。只是命令由pyhon3 -m pip install 模块名变成jython -m pip install 模块名。
Tkinter模块:
Tkinter是Python自带的库,使用Tkinter模块,无需安装任何包,就可以直接使用。
调用过程:
我们编写的Python代码会调用内置的Tkinter,Tkinter封装了访问Tk的接口;Tk会调用操作系统提供的本地GUI接口,完成最终的GUI。
Tk是一个图形库,支持多个操作系统,使用Tcl语言开发。
GUI版本的hello world:
在GUI中,每个Button、Label、输入框等,都是一个Widget。Frame则是可以容纳其他Widget的Widget,所有的Widget组合起来就是一棵树。
我们要先导入Tkinter包,然后从Frame派生一个Application类,这是所有Wideget的父容器。pack()
方法把Widget加入到父容器中,并实现布局。pack()
是最简单的布局,grid()
可以实现更复杂的布局。
from tkinter import *
class Application(Frame): # 从Frame类中派生一个Application类
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.createWidgets()
def createWidgets(self):
self.quitButton = Button(self, text='这是个退出按钮', command=self.quit)
self.helloLabel = Label(self, text="这是个标签")
self.helloLabel.pack()
self.quitButton.pack()
app = Application()
app.master.title('第一个GUI程序 hello world') # 设置窗口标题
app.mainloop() # 主消息循环
在createWidgets()
方法中,我们创建一个Label
和一个Button
,当Button被点击时,触发self.quit()
使程序退出。
然后我们实例化Application
,并启动消息循环。
GUI程序的主线程负责监听来自操作系统的消息,并依次处理每一条消息。如果消息处理非常耗时,就需要在新线程中处理。
运行截图如下:
点击“这是个退出按钮”可结束程序。
Entry和Text:
Entry 输入控件,提供一个输入框,用于显示输入的内容,并且可以对输入的内容进行转换(如转换成类似密码输入的**)。
Text 是文本控件,用于显示多行文本。
如:
import tkinter as tk
window = tk.Tk()
# 创建一个窗口对象window
window.title('我的新窗口')
# 设置窗口上面的名字
window.geometry('480x320')
# 设置窗口的大小
e = tk.Entry(window, show='*')
# 设置一个输入框,并设置输入内容被隐藏为*号,也可以设成其他符号
e.pack()
def insert_point():
var = e.get()
t.insert('insert', var)
b1 = tk.Button(window, text='insert point', width=15, height=2, command=insert_point)
b1.pack()
def insert_end():
var = e.get()
t.insert(2.1, var)
# insert第一个参数可以设为'insert',即光标所在外置,或'end',即当前输入内容之后,或2.1即第2行第1列
b2 = tk.Button(window, text='insert end', command=insert_end)
b2.pack()
t = tk.Text(window, height=2)
t.pack()
window.mainloop()
# 不断刷新窗口对象,这样才能运行
运行截图如下:
List列表部件:
Listbox是一个列表框控件,在Listbox窗口显示一个字符串列表给用户。
下面是一个使用了Listbox的例子:
import tkinter as tk
window = tk.Tk()
# 创建一个窗口对象window
window.title('我的新窗口')
# 设置窗口上面的名字
window.geometry('200x200')
# 设置窗口的大小
var1 = tk.StringVar()
l = tk.Label(window, bg='yellow', width=4, textvariable=var1)
l.pack()
# 设置一个标签,这个标签的内容为我们选择的列表中的某项
def insert_point():
value = lb.get(lb.curselection())
# value得到我们选择的列表某项的值
var1.set(value)
# 把value值赋给var1,这样就在l标签上显示出来了
# 注意这个函数动作是要在Button上点击后触发
b1 = tk.Button(window, text='insert point', width=15, height=2, command=insert_point)
b1.pack()
# 一个用来insert选择的列表值的Button
var2 = tk.StringVar()
var2.set((11, 22, 33, 44, 55))
lb = tk.Listbox(window, listvariable=var2)
lb.pack()
# 创建一个列表,列表初始值为var2中的值,并加入window对象中
list_items = [1, 2, 3, 4]
for item in list_items:
lb.insert('end', item)
lb.insert(1, 'first')
lb.insert(2, 'second')
# 将list_items中的内容插入到lb中
window.mainloop()
# 不断刷新窗口对象,这样才能运行
运行截图如下:
Radiobutton单选按钮控件:
用于显示一个单选的按钮状态。
如:
import tkinter as tk
window = tk.Tk()
# 创建一个窗口对象window
window.title('我的新窗口')
# 设置窗口上面的名字
window.geometry('320x200')
# 设置窗口的大小
var = tk.StringVar()
l = tk.Label(window, bg='yellow', width=20, text='empty')
l.pack()
# 设置一个标签,这个标签的内容为我们选择的列表中的某项
def print_selection():
l.config(text='you have selected' + var.get())
# 创建三个单选项
r1 = tk.Radiobutton(window, text='OptionA', variable=var, value='A', command=print_selection)
r1.pack()
r2 = tk.Radiobutton(window, text='OptionB', variable=var, value='B', command=print_selection)
r2.pack()
r3 = tk.Radiobutton(window, text='OptionC', variable=var, value='C', command=print_selection)
r3.pack()
window.mainloop()
# 不断刷新窗口对象,这样才能运行
运行截图如下:
Scale范围控件:
显示一个数值刻度,为输出限定范围的数字区间。
如:
import tkinter as tk
window = tk.Tk()
# 创建一个窗口对象window
window.title('我的新窗口')
# 设置窗口上面的名字
window.geometry('320x200')
# 设置窗口的大小
l = tk.Label(window, bg='yellow', width=20, text='empty')
l.pack()
# 设置一个标签,这个标签的内容为我们选择的列表中的某项
def print_selection(v):
l.config(text='you have selected' + v)
# 定义一个Scale,from_和to表示从左边最小值拉到右边最大值的范围,orient表示拉条是横向还是纵向
# length表示拉条的长度,注意这里的200指像素,和Label中的width(参数指行数和列数)不同
# resolution表示数值取几位小数
s = tk.Scale(window, label='这是一个Scale', from_=5, to=11, orient=tk.HORIZONTAL, length=200, showvalue=0, tickinterval=3,
resolution=0.01, command=print_selection)
s.pack()
window.mainloop()
# 不断刷新窗口对象,这样才能运行
运行截图如下:
Checkbutton多选勾选框控件:
用于在程序中提供多项选择框。
如:
import tkinter as tk
window = tk.Tk()
# 创建一个窗口对象window
window.title('我的新窗口')
# 设置窗口上面的名字
window.geometry('320x200')
# 设置窗口的大小
l = tk.Label(window, bg='yellow', width=20, text='please choose')
l.pack()
# 设置一个标签,这个标签的内容为我们选择的列表中的某项
# 根据我们的勾选情况,标签上会显示不同的内容
def print_selection():
if (var1.get() == 1) & (var2.get() == 0):
l.config(text='I love only Python')
elif (var1.get() == 0) & (var2.get() == 1):
l.config(text='I love only C++')
elif (var1.get() == 0) & (var2.get() == 0):
l.config(text='I do not love either')
else:
l.config(text='I love both')
var1 = tk.IntVar()
var2 = tk.IntVar()
# 选择了Python选项后,variable就会被绑定,选中则onvalue为1,不选中则offvalue为0
c1 = tk.Checkbutton(window, text='Python', variable=var1, onvalue=1, offvalue=0, command=print_selection)
c2 = tk.Checkbutton(window, text='C++', variable=var2, onvalue=1, offvalue=0, command=print_selection)
c1.pack()
c2.pack()
window.mainloop()
# 不断刷新窗口对象,这样才能运行
运行截图如下:
Canvas画布控件:
显示图形元素如线条或文本。
如:
import tkinter as tk
from PIL import Image, ImageTk
# tkinter本身只能加载gif,想加载jpg或png要用PIL模块,即写上面这句
# 在python3中安装Pillow模块即可
window = tk.Tk()
# 创建一个窗口对象window
window.title('我的新窗口')
# 设置窗口上面的名字
window.geometry('320x200')
# 设置窗口的大小
# 设置一个canvas,height和width单位都是像素
canvas = tk.Canvas(window, bg='blue', height=100, width=200)
image_file = ImageTk.PhotoImage(file='1.jpg')
# 图片放在test.py目录下
image = canvas.create_image(10, 10, anchor='nw', image=image_file)
x0, y0, x1, y1 = 50, 50, 80, 80
line = canvas.create_line(x0, y0, x1, y1)
# 画一条线从x0,y0到x1,y1
oval = canvas.create_oval(x0, y0, x1, y1, fill='red')
# 画一个圆形
arc = canvas.create_arc(x0 + 30, y0 + 30, x1 + 30, y1 + 30, start=0, extent=180)
# 画一个扇形,start和extent表示扇形从多少角度开始,然后逆时针画180度结束
rect = canvas.create_rectangle(100, 30, 100 + 20, 30 + 20)
# 画一个正方形
canvas.pack()
def moveit():
canvas.move(rect, 0, 2)
#每次移动正方形,向下两个单位
b = tk.Button(window, text='move', command=moveit).pack()
# 直接加.pack()也可以直接把对象加入到window
window.mainloop()
# 不断刷新窗口对象,这样才能运行
运行截图如下:
image中的anchor参数是一个基点,即nw,ne等等,以这个基点开始设定偏移量。下面是9种基点的名称。
Menu菜单控件:
显示菜单栏,下拉菜单和弹出菜单。
如:
import tkinter as tk
window = tk.Tk()
# 创建一个窗口对象window
window.title('我的新窗口')
# 设置窗口上面的名字
window.geometry('320x200')
# 设置窗口的大小
l = tk.Label(window, text='empty', bg='yellow', width=20)
l.pack()
counter = 0
def do_job():
global counter
l.config(text='do' + str(counter))
counter += 1
# 我们设置一个简单的交互,每次点某项计数就加1
menubar1 = tk.Menu(window)
# 创建一个主菜单
filemenu = tk.Menu(menubar1, tearoff=0, )
menubar1.add_cascade(label='file', menu=filemenu)
# 主菜单下面创建一个file菜单,tearoff表示能否分开
filemenu.add_command(label='New', command=do_job)
filemenu.add_command(label='Open', command=do_job)
filemenu.add_command(label='Save', command=do_job)
# 再设置一个分开的横线,下面再加一个exit项
filemenu.add_separator()
filemenu.add_command(label='Exit', command=window.quit)
editmenu = tk.Menu(menubar1, tearoff=0, )
menubar1.add_cascade(label='edit', menu=editmenu)
# 再创建一个edit菜单,tearoff表示能否分开
editmenu.add_command(label='Cut', command=do_job)
editmenu.add_command(label='Copy', command=do_job)
editmenu.add_command(label='Paste', command=do_job)
submenu = tk.Menu(filemenu,tearoff=0,)
filemenu.add_cascade(label='Import', menu=submenu, underline=0)
submenu.add_command(label='Submenu1', command=do_job)
# 在filemenu下创建一个侧面展开的import项,tearoff=0则Submenu1上面不会有横线
window.config(menu=menubar1)
# 把window的默认menu改成我们自定义的menubar
window.mainloop()
# 不断刷新窗口对象,这样才能运行
运行截图如下:
Frame框架控件:
在屏幕上显示一个矩形区域,用来作为容器,我们可以以Frame为一个基本单位,将要放在这个区域的标签按钮等都放在这个容器中。
如:
下面的例子里用了两层frame,主frame框架里又放了两个frame框架。
import tkinter as tk
window = tk.Tk()
# 创建一个窗口对象window
window.title('我的新窗口')
# 设置窗口上面的名字
window.geometry('320x200')
# 设置窗口的大小
tk.Label(window, text='on the window').pack()
frm = tk.Frame(window)
frm.pack()
# 主frame框架放在window对象中
frm_l = tk.Frame(frm, )
frm_r = tk.Frame(frm)
frm_l.pack(side='left')
frm_r.pack(side='right')
# frm_l和frm_r这两个frame框架放在主frame框架frm中,一个放左边,一个放右边
tk.Label(frm_l, text='on the frm_1').pack()
tk.Label(frm_r, text='on the frm_r').pack()
window.mainloop()
# 不断刷新窗口对象,这样才能运行
运行截图如下:
Messagebox弹窗控件:
用于显示你应用程序弹出的消息框。
如:
import tkinter as tk
import tkinter.messagebox as messagebox
window = tk.Tk()
# 创建一个窗口对象window
window.title('我的新窗口')
# 设置窗口上面的名字
window.geometry('320x200')
# 设置窗口的大小
def hit_me():
messagebox.showinfo(title='Hi', message='hahaha')
# 消息提示框
messagebox.showwarning(title='Hi', message='nonono')
# 警告消息提示框
messagebox.showerror(title='Hi', message='No error')
# 错误消息提示框
messagebox.askquestion(title='Hi0', message='hahaha')
# 带返回选择yes或no功能的询问消息框(点击会返回yes或no值)
messagebox.askyesno(title='Hi1', message='hahaha')
# 这个返回的值是True或False
messagebox.askokcancel(title='Hi2', message='hahaha')
# 这个返回的值也是True或False
tk.Button(window, text='hit me', command=hit_me).pack()
window.mainloop()
# 不断刷新窗口对象,这样才能运行
pack、grid、place放置位置的区别:
pack(side='')有一个参数side。可以选top、bottom、left、right。
位置示意如下:
grid(row=1,column=1,padx=10,pady=10)即直接设定在第几行第几列放置。padx和pady设定每行每列的宽度或高度。
如:
place(x=10,y=100,anchor='')指放在x=10,y=100的点上,anchor用来指定放置偏移的基点。