文本输入/输出相关控件通常包括标签(Label)、消息(Message)、输入框(Entry)、文本框(Text)。它们除前述共同属性外,都具有一些特征属性和功能。
标签(Label)和消息(Message)除单行与多行不同外,属性与用法基本一致,用于呈现文本信息。
属性text通常用于实例在第一次呈现时的固定文本,而如果需要在程序执行后发生变化,则可使用下列两种方法之一实现:
a.用控件实例的configure()方法改变属性text的值,可使显示的文本发生变化;
b.先定义一个tkinter的内部类型变量var=tkinter.StringVar(),然后用textvariable属性与这个变量联系起来textvariable=var,用var.set()方法改变var的值也可使显示文本发生变化。
举个例子,制作一个电子时钟:
用window的after()方法每隔1秒调用一次time模块以获取系统当前时间,并在标签中显示出来。
方法1:利用configure()或config()方法实现文本变化。
- import tkinter
- import time
-
-
- def gettime():
- # 获取当前时间并转为字符串
- timestr = time.strftime("%H:%M:%S")
- # 重新设置标签文本
- lb.configure(text=timestr)
- # 每隔1秒调用函数gettime自身获取时间
- window.after(1000, gettime)
-
-
- window = tkinter.Tk()
- window.title('Clock')
-
- lb = tkinter.Label(window, text='', fg='blue', font=('黑体', 80))
- lb.pack()
- gettime()
- window.mainloop()

方法2:利用textvariable变量属性实现文本变化。
- import tkinter
- import time
-
-
- def gettime():
- # 获取当前时间并转为字符串
- var.set(time.strftime("%H:%M:%S"))
- # 每隔1秒调用函数自身获取时间
- window.after(1000, gettime)
-
-
- window = tkinter.Tk()
- window.title('Clock')
- var = tkinter.StringVar()
-
- lb = tkinter.Label(window, textvariable=var, fg='blue', font=('黑体', 80))
- lb.pack()
- gettime()
- window.mainloop()

文本框(Text)的常用方法如下:

每隔1秒取一次当前日期时间,并写入文本框中:
调用datatime.now()获取当前日期时间,用insert()方法每次从文本框txt的尾部(END)开始追加文本。
- from tkinter import *
- import datetime
-
-
- def gettime():
- s = str(datetime.datetime.now()) + '\n'
- txt.insert(END, s)
- # 每隔1秒调用一次函数gettime自身获取时间
- window.after(1000, gettime)
-
-
- window = Tk()
- window.geometry('320x240')
- txt = Text(window)
- txt.pack()
- gettime()
- window.mainloop()

输入框(Entry)通常作为功能较为单一的接收单行文本输入的控件,虽然也有许多对其中文本进行操作的方法,但常用的只有取值方法get()和用于删除文本的detele(起始位置,终止位置),例如,清空输入框为detele(0,tkinter.END)。
按钮(Button)主要是为响应鼠标单击事件触发运行程序所设的,故其除控件共有属性外,属性command是最为重要的属性。
通常,将按钮要触发执行的程序以函数形式预先定义,然后可用以下两种方法调用函数。
a.直接调用函数。参数表达式为"command=函数名",注意函数名后不要加括号,也不能传递参数。
b.利用匿名函数调用函数和传递参数。参数表达式为"command=lambda:函数名(参数列表)"。
简单加法器:
从两个输入框取得输入文本后转为浮点数进行加法运算,要求每次单击按钮产生的算式结果以文本形式追加到文本框中,并将原输入框清空。
按钮方法a不传递参数调用函数run1()实现,按钮方法b用lambda调用函数run2(x,y),并同时传递参数实现。
- from tkinter import *
-
-
- def run1():
- a = float(inp1.get())
- b = float(inp2.get())
- s = '%0.2f + %0.2f=%0.2f\n' % (a, b, a + b)
- txt.insert(END, '方法1: ' + s) # 追加显示运算结果
- inp1.delete(0, END) # 清空输入
- inp2.delete(0, END)
-
-
- def run2(x, y):
- a = float(x)
- b = float(y)
- s = '%0.2f+%0.2f=%0.2f\n' % (a, b, a + b)
- txt.insert(END, '方法2: ' + s) # 追加显示运算结果
- inp1.delete(0, END)
- inp2.delete(0, END)
-
-
- window = Tk()
- window.geometry('460x240')
- window.title('简单加法器')
- lb1 = Label(window, text='请输入两个数,按下面两个按钮之一进行加法计算')
- lb1.place(relx=0.1, rely=0.1, relwidth=0.8, relheight=0.1)
- inp1 = Entry(window)
- inp1.place(relx=0.1, rely=0.2, relwidth=0.3, relheight=0.1)
- inp2 = Entry(window)
- inp2.place(relx=0.6, rely=0.2, relwidth=0.3, relheight=0.1)
-
- # 方法一直接调用run1()
- btn1 = Button(window, text='方法一', command=run1)
- btn1.place(relx=0.1, rely=0.4, relwidth=0.3, relheight=0.1)
-
- # 方法二利用lambda传参数调用run2()
- btn2 = Button(window, text='方法二',
- command=lambda: run2(inp1.get(), inp2.get()))
- btn2.place(relx=0.6, rely=0.4, relwidth=0.3, relheight=0.1)
-
- # 在窗体垂直自上而下位置60%处起,布局相对窗体高度40%高的文本框
- txt = Text(window)
- txt.place(rely=0.6, relheight=0.4)
- window.mainloop()

单选按钮(Radiobutton)是为响应互相排斥的若干单选项的单击事件以触发运行自定义函数所设的,该控件除具有共有属性外,还具有显示文本(text)、返回变量(variable)、返回值(value)和响应函数名(command)等重要的属性。
响应函数名"command=函数名"的用法与Button相同,函数名最后也不要加括号。
返回变量variable=var通常应预先声明变量的类型var=tkinter.IntVar()或var=tkinter.StringVar(),在所调用的函数中方可用var.get()取得被选中实例的value值。
利用单选项按钮实现,单击选项后,可以将选中结果显示在标签上:
- from tkinter import *
-
-
- def Mysel():
- dic = {0: 'A', 1: 'B', 2: 'C'}
- s = "You get the " + dic.get(var.get()) + ' option.'
- lb.config(text=s)
-
-
- window = Tk()
- lb = Label(window)
- lb.pack()
-
- var = IntVar()
- rd1 = Radiobutton(window, text='A', variable=var, value=0, command=Mysel)
- rd1.pack()
-
- rd2 = Radiobutton(window, text='B', variable=var, value=1, command=Mysel)
- rd2.pack()
-
- rd3 = Radiobutton(window, text='C', variable=var, value=2, command=Mysel)
- rd3.pack()
-
- window.mainloop()
