滑块(Scale)是一种直观地进入数值输入的交互控件,其主要属性为:
滑块控件实例的主要方法较为简单,有get()和set(值),分别为取值和将滑块设在某特定值上。
滑块实例也可绑定鼠标左键释放事件<ButtonRelease-1>,并在执行函数中添加参数event来实现事件响应。
在窗体上设计一个200像素宽的水平滑块,取值范围为1.0~5.0,分辨精度为0.05,刻度间隔为1,用鼠标拖动滑块后释放鼠标可读取滑块值并显示在标签上:
- from tkinter import *
-
-
- def show(event):
- s = '滑块的取值为' + str(var.get())
- lb.config(text=s)
-
-
- window = Tk()
- window.title('滑块学习')
- window.geometry('320x180')
- var = DoubleVar()
- scl = Scale(window, orient=HORIZONTAL, length=200, from_=1.0, to=10.0,
- label='请拖动滑块', tickinterval=1, resolution=0.05, variable=var)
- scl.bind('<ButtonRelease-1>', show)
- scl.pack()
- lb = Label(window, text='')
- lb.pack()
- window.mainloop()
菜单(Menu)用于可视化地为一系列命令进行分组,从而方便用户找到和触发执行这些命令。这里Menu所实例化的是主菜单。其通式为:
- 菜单实例名 = Menu(根窗体)
- 菜单分组1 = Menu(菜单实例名)
- 菜单实例名.add_cascade(<label=菜单分组1显示文本>,<menu=菜单分组1>)
- 菜单分组1.add_command(<label=命令1文本>,<command=命令1函数名>)
- 菜单分组1.add_command(<label=命令2文本>,<command=命令2函数名>)
- ...
- 菜单分组1.add_command(<label=命令n文本>,<command=命令n函数名>)
其中较为常见的方法有add_cascade()、add_command()和add_separator(),分别用于添加一个菜单分组、添加一条菜单命令和添加一条分隔线。
利用Menu控件也可以创建快捷次菜单(又称为上下文菜单)。通常,将需要右击弹出的控件实例绑定鼠标右击响应事件<Button-3>,并指向一个捕获event参数的自定义函数,在该自定义函数中执行,将鼠标的触发位置event.x_root和event.y_root以post()方法传回菜单。
仿照Windows自带的“记事本”中的“文件”和“编辑”菜单,实现在主菜单和快捷菜单上触发菜单命令,并相应改变窗体上标签的文本内容:
菜单实例名为mainmenu,分为menuFile(“文件”菜单)和menuEdit(“编辑”菜单)两组,分别添加“新建、打开、保存、退出”(保存与退出之间要有一条分隔线)和“剪切、复制、粘贴”菜单命令。
在本例中直接将根窗体绑定了鼠标右击响应事件,则在窗体的任何位置均可右击触发,并且直接将主菜单实例mainmenu作为右击执行函数popupmenu(event)所触发的菜单实例,可实现快捷菜单与主菜单一致,并呈现出多级菜单的形式。注意:作为菜单的应用示例,本例并没有具体执行菜单命令,仅以标签文字作为示意。
- from tkinter import *
-
-
- def new():
- s = '新建'
- lb1.config(text=s)
-
-
- def open():
- s = '打开'
- lb1.config(text=s)
-
-
- def save():
- s = '保存'
- lb1.config(text=s)
-
-
- def cut():
- s = '剪切'
- lb1.config(text=s)
-
-
- def copy():
- s = '复制'
- lb1.config(text=s)
-
-
- def paste():
- s = '粘贴'
- lb1.config(text=s)
-
-
- def popupmenu(event):
- mainmenu.post(event.x_root, event.x_root)
-
-
- window = Tk()
- window.title('菜单学习')
- window.geometry('320x240')
- lb1 = Label(window, text='显示信息', font=('黑体', 32, 'bold'))
- lb1.place(relx=0.2, rely=0.2)
- mainmenu = Menu(window)
- menuFile = Menu(mainmenu) # 菜单分组menuFile
- mainmenu.add_cascade(label='文件', menu=menuFile)
- menuFile.add_command(label='新建', command=new)
- menuFile.add_command(label='打开', command=open)
- menuFile.add_command(label='保存', command=save)
- menuFile.add_separator() # 分隔线
- menuFile.add_command(label='退出', command=window.destroy)
-
- menuEdit = Menu(mainmenu) # 菜单分组menuEdit
- mainmenu.add_cascade(label='编辑', menu=menuEdit)
- menuEdit.add_command(label='剪切', command=cut)
- menuEdit.add_command(label='复制', command=copy)
- menuEdit.add_command(label='粘贴', command=paste)
-
- window.config(menu=mainmenu)
- window.bind('<Button-3>', popupmenu) # 根窗体绑定鼠标右击响应事件
- window.mainloop()
用Toplevel可新建一个显示在最前面的子窗体。其通式为:
字体实例名=Toplevel(根窗体)
子窗体与根窗体类似,也可设置title、geometry等属性,并在上面布局其他控件。
在根窗体上创建菜单,触发创建一个新窗体:
- from tkinter import *
-
-
- def newwind():
- winNew = Toplevel(window)
- winNew.geometry('320x240')
- winNew.title('新建窗体')
- lb2 = Label(winNew, text='我在新窗体上')
- lb2.place(relx=0.2, rely=0.2)
- btClose = Button(winNew, text='关闭', command=winNew.destroy)
- btClose.place(relx=0.7, rely=0.5)
-
-
- window = Tk()
- window.title('新建窗体学习')
- window.geometry('320x240')
- lb1 = Label(window, text='主窗体', font=('黑体', 32, 'bold'))
- lb1.place(relx=0.2, rely=0.2)
- mainmenu = Menu(window)
- menuFile = Menu(mainmenu)
- mainmenu.add_cascade(label='菜单', menu=menuFile)
- menuFile.add_command(label='新窗体', command=newwind)
- menuFile.add_separator()
- menuFile.add_command(label='退出', command=window.destroy)
- window.config(menu=mainmenu)
- window.mainloop()
关闭窗体程序运行的方法通常用destroy(),而不建议用quit()
用Toplevel所创建的子窗体是非模式(Modeless)的窗体,虽然初建时子窗体在最前面,但根窗体上的控件实例也是可以被操作的。
所谓模式(Modal)对话框,是相对于前面所介绍的非模式窗体而言的,所弹出的对话框必须应答,在关闭之前无法操作其后面的其他窗体。常见的模式对话框有消息对话框、输入对话框、文件选择框、颜色选择对话框等。
交互对话框
(1)消息对话框
引用tkinter.messagebox包,可使用下表所列的消息对话框函数。执行这些函数,可弹出模式消息对话框,并根据用户的响应返回一个布尔型值。其通式为:
消息对话框函数(<title=标题文本>,<message=消息文本>,[其他参数])
单击按钮,弹出确认取消对话框,并将用户回答显示在标签中:
- from tkinter import *
- import tkinter.messagebox
-
-
- def xz():
- answer = tkinter.messagebox.askokcancel('请选择', '请选择确认或取消')
- if answer:
- lb.config(text='已确认')
- else:
- lb.config(text='已取消')
-
-
- window = Tk()
- lb = Label(window, text='')
- lb.pack()
- btn = Button(window, text='弹出对话框', command=xz)
- btn.pack()
- window.mainloop()
(2)输入对话框
引用tkinter.simpledialog包,可弹出输入对话框,用以接收用户的简单输入。输入对话框通常有sakstring()、askinteger()和askfloat()三种函数,分别用于接收字符串、整数和浮点数类型的输入。
单击按钮,弹出输入对话框,接受文本输入并显示在窗体的标签上:
文件选择对话框
引用tkinter.filedialog包,可弹出文件选择对话框,让用户直观地选择一个或一组文件,以供进一步的文件操作。常用的文件选择对话框函数有askopenfilename()、askopenfilenames()和asksaveasfilename(),分别用于进一步打开一个文件、一组文件和保存文件。其中,askopenfilename()和asksavefilename()函数的返回值类型为包含文件路径的文件名字符串,而askopenfilenames()函数的返回值类型为元组。
单击按钮,弹出文件选择对话框(“打开”对话框),并将用户所选择的文件路径和文件名显示在窗体的标签上:
- from tkinter import *
-
- import tkinter.filedialog
-
-
- def xz():
- filename = tkinter.filedialog.askopenfilename()
- if filename != '':
- lb.config(text='您选择的文件是' + filename)
- else:
- lb.config(text='您没有选择任何文件')
-
-
- window = Tk()
- lb = Label(window, text='')
- lb.pack()
- btn = Button(window, text='弹出文件选择对话框', command=xz)
- btn.pack()
- window.mainloop()
颜色选择对话框
引用tkinter.colorchooser包,可使用askcolor()函数弹出模式颜色选择对话框,让用户可以个性化地设置颜色属性。
该函数的返回形式为包含RGB十进制浮点值元组和RGB十六进制字符串的元组类型,例如:"((135.52734375,167.65234375,186.7265625),'#87a7ba')"。通常,可将其转换为字符串类型后,再截取以十六进制数表示的RGB颜色子串用于为属性赋值。
单击按钮,弹出颜色选择对话框,并将用户所选择的颜色设置为窗体上标签的背景颜色:
- from tkinter import *
- import tkinter.colorchooser
-
-
- def xz():
- color = tkinter.colorchooser.askcolor()
- colorstr = str(color)
- lb.config(text=colorstr[-9:-2], background=colorstr[-9:-2])
-
-
- window = Tk()
- lb = Label(window, text='请关注颜色的变化')
- lb.pack()
- btn = Button(window, text='弹出颜色选择对话框', command=xz)
- btn.pack()
- window.mainloop()