Python教程 - Tkinter

用户与程序的交互

  • CLI(Command Line Interface,命令行接口)
  • GUI( Graphical User Interface,图形用户接口)

CLI

Command Line Interface,命令行接口,以一行文字作为输入,一般只能显示文字,例如windows自带的cmd

cmd

GUI

Graphical User Interface,图形用户接口,我们常用的window系统就有很多丰富的界面,包括窗口、按钮、文本显示,图片显示等等

gui

python上的GUI库 -- Tkinter

Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。IDLE、turtle界面也是用 Tkinter 编写而成。

Tkinter窗体

Python自带的可编辑的GUI界面,是一个图像窗口。Tkinter是使用 python 进行窗口视窗设计的模块。
示例:

# 导入tkinter库
import tkinter

# 创建一个窗体
main = tkinter.Tk()
# 进入消息循环,让窗口可以不断刷新
main.mainloop()

设置窗体的属性

import tkinter

main = tkinter.Tk()
# 设置标题
main.title("My First Window")
# 设置大小(宽x高)
main.geometry("300x200")
main.mainloop()

Tkinter显示控件--Label

Label(标签)控件,是最简单的显示控件,可以显示一些文字
示例:

import tkinter

main = tkinter.Tk()
l = tkinter.Label(main,text='First Label')
l.pack()
main.mainloop()


其中'l.pack()'表示将创建的Label控件l放到main布局中

设置Label的背景颜色

可在创建Label控件时指定bg属性为相应的背景颜色
示例:

import tkinter

main = tkinter.Tk()
l = tkinter.Label(main,text='First Label',bg='red')
l.pack()
main.mainloop()

也可以通过config方式进行配置
Label可以设置以下属性

属性 说明
bg 背景颜色
fg 前景颜色,即文字的颜色
text 显示的文字
height 控件的高度,Label中表示为一个字符高度的多少倍
width 控件的宽度,Label中表示为一个字符宽度的多少倍
... ...
示例
import tkinter

main = tkinter.Tk()
l = tkinter.Label(main)
l.config(text='First Label')
l.config(bg='red')
l.pack()
main.mainloop()

Tkinter按钮控件 -- Button

Button(按钮)可以让用户点击
示例

b = tkinter.Button(main)
b.config(text='First Button')
b.pack()


同理,也可以设置config改变背景颜色等属性

b = tkinter.Button(main)
b.config(text='First Button')
b.config(bg='green')
b.pack()

按钮的点击事件处理

以上示例的按钮点击没有任何反应,因为我们还没有设置按钮的command属性,该属性表示点击按钮后会调用的函数。
因此我们需要先定义一个函数,例如

def btn_click():
    print('Button Click')

然后,设置按钮的command属性为上面定义的btn_click函数

b.config(command=btn_click)

运行程序,点击按钮,观察IDLE输出,可以观察到,每次点击按钮,IDLE都会输出一句Button Click

我们也可以通过按钮的点击事件改变其他控件的属性,例如label控件的显示文字,只需要在btn_click

def btn_click():
    print('Button Click')
    l.config(text='changed')

运行程序,点击按钮就会改变label的显示文字了

完整代码为:

import tkinter

def btn_click():
    print('Button Click')

main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x200')

l = tkinter.Label(main, text='First label')
l.config(bg='red')
l.config(fg='white')
l.config(height=5)
l.config(width=20)
l.pack()

b = tkinter.Button(main,text='Click me')
b.config(bg='green')
b.config(command=btn_click)
b.pack()

main.mainloop()

Tkinter的输入框控件 -- Entry

Python Tkinter 文本框用来让用户输入一行文本字符串。
示例, 创建一个输入框

e = tkinter.Entry(main)
e.pack()

获取和设置输入框的文字

有了输入框,我们可以让用户输入文字。但是上面的程序还没有处理用户输入了什么。
我们通过按钮的事件来进行配合,label的文字改为提示语:“Input some text:”,button的文字改为“OK”,并在button_click函数中处理输入框entry里用户输入的文字

def btn_click():
    print(e.get())
    l.config(text=e.get())

这样我们在输入框entry输入文字后,点击OK按钮,会发现标签label的文字也会随之改变

我们也可以一开始在创建输入框entry的时候设置默认的文字

e = tkinter.Entry(main)
e.insert(0,'000')
e.pack()

这样窗口创建时entry就会自动有默认的输入文字
完整代码如下:

import tkinter

def btn_click():
    print(e.get())
    l.config(text=e.get())

main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x200')

l = tkinter.Label(main, text='Input some text')
l.config(bg='red')
l.config(fg='white')
l.config(height=2)
l.config(width=20)
l.pack()

e = tkinter.Entry(main)
e.insert(0,'000')
e.pack()

b = tkinter.Button(main,text='OK')
b.config(bg='green')
b.config(command=btn_click)
b.pack()

main.mainloop()

tkinter的消息提醒控件 -- massagebox

消息框,用于显示你应用程序的消息框,也就是我们平时看到的弹窗。
一个简单的提示框示例:

import tkinter.messagebox  # 要使用messagebox先要导入模块

tkinter.messagebox.showinfo(title='tips', message='Hello!')

消息框messagebo一般在用户进行了某些操作之后处理信息时使用。
因此,经常会在按钮button的点击事件函数里使用。
例如,我们可以接着上面的例子,在用户点击button后,获取输入框entry的文字进行相应的提示:

import tkinter.messagebox

def btn_click():
    tkinter.messagebox.showinfo(title='tips', message=e.get())

提示信息的几种形式

messagebox提示信息的几种形式:

tkinter.messagebox.showinfo(title='tips', message='hello')            # 提示信息对话窗
tkinter.messagebox.showwarning(title='tips', message='warning')       # 提出警告对话窗
tkinter.messagebox.showerror(title='tips', message='error!')         # 提出错误对话窗
print(tkinter.messagebox.askquestion(title='tips', message='need some help?'))  # 询问选择对话窗return 'yes', 'no'
print(tkinter.messagebox.askyesno(title='tips', message='hello'))     # return 'True', 'False'
print(tkinter.messagebox.askokcancel(title='tips', message='hello'))  # return 'True', 'False'
对话框 示例
showinfo提示信息对话框
showwarning提示警告对话框
showerror提示错误对话框
askyesno选择对话框

我们可以根据判断用户的输入来进行不同形式的提示,例如判断输入是不是为“123456”
示例

import tkinter.messagebox

def btn_click():
    if e.get() == '123456':
        tkinter.messagebox.showinfo(title='tips', message='bingo')
    else:
        tkinter.messagebox.showerror(title='tips', message='error')

完整代码:

import tkinter
import tkinter.messagebox

def btn_click():
    if e.get() == '123456':
        tkinter.messagebox.showinfo(title='tips', message='bingo')
    else:
        tkinter.messagebox.showerror(title='tips', message='error')

main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x200')

l = tkinter.Label(main, text='Input some text')
l.config(bg='red')
l.config(fg='white')
l.config(height=2)
l.config(width=20)
l.pack()

e = tkinter.Entry(main)
e.insert(0,'000')
e.pack()

b = tkinter.Button(main,text='OK')
b.config(bg='green')
b.config(command=btn_click)
b.pack()

main.mainloop()

tkinter的列表框控件 -- Listbox

Listbox(列表框)组件用于显示一个选择列表。Listbox 只能包含文本项目,并且所有的项目都需要使用相同的字体和颜色。根据组件的配置,用户可以从列表中选择一个或多个选项。

创建和设置Listbox

创建一个Listbox,并放置到主窗口:

lbox = tkinter.Listbox(main)
lbox.pack()

此时创建的Listbox没有任何内容,需要往里面插入内容
例如插入fruits:

fruits = ['apple', 'banana', 'orange']
for f in fruits:
    lbox.insert('end', f)

image
完整代码:

import tkinter

main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x300')

lbox = tkinter.Listbox(main)
lbox.pack()

fruits = ['apple', 'banana', 'orange']
for f in fruits:
    lbox.insert('end', f)

main.mainloop()

获取Listbox的选择内容

curselection():

返回一个元组,包含被选中的选项的序号(从 0 开始)
如果没有选中任何选项,返回一个空元组

get(first, last=None):

返回一个元组,包含参数 first 到 last 范围内(包含 first 和 last)的所有选项的文本
如果忽略 last 参数,表示返回 first 参数指定的选项的文本

例如,添加一个按钮获取Listbox选择的内容:

def btn_click():
    sl = lbox.curselection()
    for i in sl:
        print(i)
        tkinter.messagebox.showinfo(message=lbox.get(i))

b = tkinter.Button(main, text='ok')
b.config(command=btn_click)
b.pack()

image
完整代码:

import tkinter
import tkinter.messagebox

def btn_click():
    sl = lbox.curselection()
    for i in sl:
        print(i)
        tkinter.messagebox.showinfo(message=lbox.get(i))

main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x300')

lbox = tkinter.Listbox(main)
lbox.pack()

fruits = ['apple', 'banana', 'orange']
for f in fruits:
    lbox.insert('end', f)

b = tkinter.Button(main, text='ok')
b.config(command=btn_click)
b.pack()

main.mainloop()

删除Listbox中的内容

delete(first, last=None):

删除参数 first 到 last 范围内(包含 first 和 last)的所有选项
如果忽略 last 参数,表示删除 first 参数指定的选项

例如在btn_click中将选择的内容用delete删除:

def btn_click():
    sl = lbox.curselection()
    for i in sl:
        print(i)
        lbox.delete(i)

选择其中一个内容(例如banana),然后点击按钮,就可以发现选择的内容已被删除
image
image
完整代码:

import tkinter
import tkinter.messagebox

def btn_click():
    sl = lbox.curselection()
    for i in sl:
        print(i)
        lbox.delete(i)

main = tkinter.Tk()
main.title('Hello tkinter')
main.geometry('300x300')

lbox = tkinter.Listbox(main)
lbox.pack()

fruits = ['apple', 'banana', 'orange']
for f in fruits:
    lbox.insert('end', f)

b = tkinter.Button(main, text='delete')
b.config(command=btn_click)
b.pack()

main.mainloop()

单选按钮RadioButton

RadioButton一般用于提供一组选项,让用户从多个选项中选择其中一个。

完整代码:

import tkinter

def rbtn_selected():
    print('You select', v.get())

main = tkinter.Tk()
main.geometry("300x300")

v = tkinter.IntVar()

r1 = tkinter.Radiobutton(main, text='One', variable=v, value=1)
r1.config(command=rbtn_selected)
r1.pack()

r2 = tkinter.Radiobutton(main, text='Two', variable=v, value=2)
r2.config(command=rbtn_selected)
r2.pack()

r3 = tkinter.Radiobutton(main, text='Three', variable=v, value=3)
r3.config(command=rbtn_selected)
r3.pack()

main.mainloop()

勾选按钮CheckButton

CheckButton一般用于提供一组选项,让用户从其中选择多个。

完整代码

import tkinter

def cbtn_selected():
    print('You select', v1.get(), v2.get())

main = tkinter.Tk()
main.geometry("300x300")

v1 = tkinter.IntVar()
v2 = tkinter.IntVar()

c1 = tkinter.Checkbutton(main, text='apple', variable=v1, onvalue=1, offvalue=0)
c1.config(command=cbtn_selected)
c1.pack()

c2 = tkinter.Checkbutton(main, text='banana', variable=v2, onvalue=1, offvalue=0)
c2.config(command=cbtn_selected)
c2.pack()

main.mainloop()

拖动条Scale

Scale一般用于提供一个范围内的数字选择,让用户可以拖动。

完整代码

import tkinter

def btn_click():
    print('horizontal', s1.get())
    print('vertical', s2.get())

main = tkinter.Tk()
main.geometry("300x300")

s1 = tkinter.Scale(main, label='drag me', from_=1, to=100)
s1.config(orient=tkinter.HORIZONTAL)
s1.pack()

s2 = tkinter.Scale(main, label='drag me', from_=1, to=100)
s2.config(orient=tkinter.VERTICAL)
s2.pack()

b = tkinter.Button(main, text='OK')
b.config(command=btn_click)
b.pack()

main.mainloop()

posted @ 2022-02-27 22:33  hgrun  阅读(1617)  评论(0编辑  收藏  举报