Python中的几种GUI界面库、使用Python中的Tkinter模块创建图形界面

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zgcr654321/article/details/82750122

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用来指定放置偏移的基点。

猜你喜欢

转载自blog.csdn.net/zgcr654321/article/details/82750122