python tkinter学习——tkinter部件1

时间:2022-06-12 19:32:43

tkinter部件

一、Tk() & Label() & Button()

1,Tk() 窗口

用Tk()创建窗口对象:

#文件名:test1.py
import tkinter as tk
window = tk.Tk() #创建一个窗口对象window
window.title('my window') #设置window标题
window.geometry('400x400') #设置window大小

#中间填写window的内容

window.mainloop() #不断刷新窗口

效果如图:

python tkinter学习——tkinter部件1

2,Label() 标签

用Tk()创建窗口对象后,在窗口中用Label()创建标签对象

#文件名:test1.py
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('400x400')

#创建一个标签对象l
l = tk.Label(window, #使标签位于window中
    text='my label', #设置标签文字
    bg='green', #设置标签背景色
    font=('Arial',12), #设置标签文字字体字号
    width=15, #设置标签宽度,15表示15个字符的高度
    height=2) #设置标签高度,2表示2个字符的宽度
l.pack() #设置标签位置

window.mainloop()

效果如图:

python tkinter学习——tkinter部件1

3,Button() 按钮

再用Button()创建一个按钮对象:

#文件名:test1.py
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('400x400')

l = tk.Label(window,
    text='my label',
    bg='green',
    font=('Arial',12),
    width=15,
    height=2)
l.pack()

#创建一个按钮对象b
b = tk.Button(window, #使按钮位于window中
    text='my button', #设置窗口文字
    width=15, #设置窗口宽度
    height=2) #设置窗口高度
b.pack() #设置窗口位置

window.mainloop()

效果如图:

python tkinter学习——tkinter部件1

当然啦,按钮是拿来使用的,需要给按钮添加特定的功能。

这里我们给按钮添加一个简单的小功能:点击按钮,显示标签文字,再次点击按钮,隐藏标签文字,再次点击按钮,显示标签文字······

效果如下:

python tkinter学习——tkinter部件1

这需要在按钮的属性中添加command=hit,hit是一个函数,用来控制标签文字的显示与隐藏,command=hit的意思是点击按钮时将会执行hit函数。

接下来要定义hit函数,hit函数控制标签文字的显示与隐藏,那么可以将标签文字作为一个字符串变量,如果该变量为'my label',则点击时将其赋值为空字符串,如果该变量为空字符串,则点击时将其赋值为'my label'。

具体代码如下:

#文件名:test1.py
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('400x400')

var = tk.StringVar() #设置var为tk中的StringVar变量
l = tk.Label(window,
    textvariable=var, #设置标签文字为var,注意要把text改为textvariable
    bg='green',
    font=('Arial',12),
    width=15,
    height=2)
l.pack()

on_hit = False #设置变量on_hit用来表示标签文字状态,False表示空,True表示非空
def hit():
    global on_hit
    if on_hit == False: #如果标签文字为空
        var.set('my label') #将其设为'my label'
        on_hit = True #更新标签文字状态
    else: #否则
        var.set('') #将其设为空
        on_hit = False #更新标签文字状态

b = tk.Button(window,
    text='my button',
    width=15,
    height=2,
    command=hit) #点击时执行hit函数
b.pack()

window.mainloop()

效果如图:

python tkinter学习——tkinter部件1

我们在定义var时没有设置其初始值,因此一开始标签文字为空。如果要给var设置初始值'my label',可以在定义var的下一行写上var.set('my label'),注意不能在定义时直接设置初始值var = tk.StringVar().set('my label')

另外,var是tk中定义的StringVar变量,要用set方法赋值,不能写var = 'my label'

二、Entry() & Text()

1,Entry() 输入框

用Entry()创建一个输入框对象:

#文件名:test2.py
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('400x400')

#创建一个输入框对象e
e = tk.Entry(window, #使输入框位于window中
    show='*') #设置输入内容不可见,如果show=None则为可见,默认值为None
e.pack() #设置输入框位置

window.mainloop()

效果如图:

python tkinter学习——tkinter部件1

2,Text() 文本框

再用Text()创建一个文本框对象:

#文件名:test2.py
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('400x400')

e = tk.Entry(window,
    show='*')
e.pack()

#创建一个文本框对象t
t = tk.Text(window, #使文本框位于window中
    height=2) #设置文本框高度
t.pack() #设置文本框位置
window.mainloop()

效果如图:

python tkinter学习——tkinter部件1

文本框和输入框有些类似,也可以在里面输入文字。一般将输入框用于输入用户名、密码等情况,而文本框则用于输入大段文字。

接下来我们实现这样一个效果:在输入框中输入文字,点击按钮,文字插入到文本框中。且有两种插入方式,一种是将文字插入到光标所在位置,另一种是将文字插入到文本框中文字的结尾。效果如下:

python tkinter学习——tkinter部件1

首先我们需要添加两个按钮,并定义两个函数,分别完成上述两种不同插入方式。

具体代码如下:

#文件名:test2.py
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('400x400')

e = tk.Entry(window) #输入内容可见
e.pack()

def insert_point():
    var = e.get() #获得输入框e中的文字
    t.insert('insert',var) #将变量var插入文本框t中,'insert'表示从光标处插入
def insert_end():
    var = e.get()
    t.insert('end',var) #'end'表示从结尾处插入

b1 = tk.Button(window,
    text='insert_point',
    command=insert_point)
b1.pack()
b2 = tk.Button(window,
    text='insert_end',
    command=insert_end)
b2.pack()

t = tk.Text(window,
    height=2)
t.pack()
window.mainloop()

效果如图:

python tkinter学习——tkinter部件1

这里用insert方法实现了将文字插入文本框的两种不同方式,除了这里用到的'insert'、'end'外,还有一种更具体的插入方式t.insert(2.3,var),2.3表示将变量var插入到文本框的第2行第3列。

三、Listbox() 列表框

用Listbox()创建列表框对象:

#文件名:test3.py
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('400x400')

var1 = tk.StringVar() #设置var为tk中的StringVar变量
var1.set([11,22,33,44]) #将var初始化为列表
# 创建一个列表框对象
lb = tk.Listbox(window, #使列表框位于window中
    listvariable=var1) #设置列表框内容为var
# 下面介绍几个更改列表框内容的方法
list_item = [1,2,3,4]
for item in list_item: #通过循环将列表list_item的元素插入到列表框中
    lb.insert('end',item)
lb.insert(1,'first') #在列表框第1行插入'first'
lb.insert(2,'second') #在列表框第2行插入'second'
lb.delete(2) #将列表框第2行元素删除,下面的元素会依次填充上来
lb.pack()

window.mainloop()

效果如图:

python tkinter学习——tkinter部件1

要注意的是,前面我们直接设置标签内容时,写上text='my label,之后通过StringVar变量来间接设置标签内容时,则是写上textvariable=var

上面我们在给列表框设置内容时是通过StringVar变量间接设置的,可能你会觉得我们在给列表框设置内容时,也可以直接写上list=[11,22,33,44],但和text不同,list是关键字,因此不能这么做,只能采用间接方式。

此外,上面的列表也可以替换为元组。

接下来我们实现这样一个效果:选择列表框中的某行,点击按钮,该行内容便显示在标签上。效果如下:

python tkinter学习——tkinter部件1

#文件名:test3.py
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('400x400')

var1 = tk.StringVar()
l = tk.Label(window,
    textvariable=var1,
    bg='green',
    width=15,
    height=2)
l.pack()

def print_choose():
    value = lb.get(lb.curselection()) #获得列表框lb中被选中的内容,curselection也即cursor selection(鼠标选择)。
    var1.set(value) #将标签文字设为该内容

b = tk.Button(window,
    text='print choose',
    command=print_choose)
b.pack()

var2 = tk.StringVar()
var2.set([11,22,33,44])
lb = tk.Listbox(window,
    listvariable=var2)
lb.pack()

window.mainloop()

效果如图:

python tkinter学习——tkinter部件1

四、Radiobutton() 单选框

用Radiobutton()创建单选框对象:

#文件名:test4.py
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('400x400')

var = tk.StringVar()

#创建一组单选框对象
r1 = tk.Radiobutton(window, #使单选框对象位于window中
    text='选项A', #设置单选框文字
    variable=var, #将这组单选框与变量var关联,用var表示当前的选择状态
    value='A') #相当于每个单选框的id
r1.pack()
r2 = tk.Radiobutton(window,
    text='选项B',
    variable=var,
    value='B',)
r2.pack()
r3 = tk.Radiobutton(window,
    text='选项C',
    variable=var,
    value='C',)
r3.pack()
#r1、r2、r3都与变量var关联(var必须为全局变量),说明它们构成一组单选框,且var表示当前选中状态。
#当选中r1时,变量var被赋值为r1的value,表示当前value='A'的单选框被选中。由于r2、r3的value不是'A',因此r2、r3变为未选中状态。
#如果r1、r2的value相同,比如都为'A',当选中r1时,r2同时被选中,r3变为未选中状态。

window.mainloop()

效果如图:

python tkinter学习——tkinter部件1

接下来我们实现这样一个效果:点击一组单选框中的某一个,标签中显示出对应提示。

效果如下:

python tkinter学习——tkinter部件1

选中单选框时,关联变量会被赋值为单选框的value属性,因此,只需定义一个函数,在标签文字中加上关联变量的值即可。

具体代码如下:

#文件名:test4.py
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('400x400')

l = tk.Label(window,
    text='',
    bg='yellow',
    width=20)
l.pack()

var = tk.StringVar()
def print_choose():
    l.config(text='you have choose ' + var.get()) #使用config()可以设置对象的各项属性,这里我们将标签文字设为相应内容

r1 = tk.Radiobutton(window,
    text='选项A',
    variable=var,
    value='A',
    command=print_choose)
r1.pack()
r2 = tk.Radiobutton(window,
    text='选项B',
    variable=var,
    value='B',
    command=print_choose)
r2.pack()
r3 = tk.Radiobutton(window,
    text='选项C',
    variable=var,
    value='C',
    command=print_choose)
r3.pack()

window.mainloop()

效果如图:

python tkinter学习——tkinter部件1

在设置标签文字时,我们使用了text='you have choose ' + var.get(),这里不能直接将var与字符串'you have choose '连接。

【待解决的疑问】

上面例子中,单选框初始状态都是被选中,怎样将其初始状态改为未选中?