图形化界面设计—Tkinter模块学习(三)

文章目录

前言

十二、组合框Combobox

十三、滑块Scale

十四、菜单Menu

十五、子窗体Toplevel

十六、对话框

1、消息对话框

2、输入对话框

3、文件选择对话框

4、颜色选择对话框

十七、绑定事件

 总结:


前言

这里我将继续承接上次写到的 第十一点 ‘文本框Text’

十二、组合框Combobox

Combobox实质上就是带文本框的下拉列表框,可以将python的列表类型数据可视化呈现,在实际应用中因为其灵活的界面,往往比列表框受欢迎。该控件并不直接包含在tkinter模块中,而是包含在tkinter的子模块中ttk里面如果要使用需要单独导入(from tkinter.ttk import *) , 基本用法如下:

实例名称 = tk.Combobox(根窗口,属性(如:textvariable=,values=)

注意:在创建Combobox时需要先绑定tkinter内部类型变量

1、var=tk.StringVar() (如果导入tkinter模块的 * 这里可以省略 tk);

2、设置实例属性 textvariable=var、values=列表/元组..,

该控件除了共有属性还有get()获得选中值,current()获得选中项的索引值。

相关代码展示如下:

import tkinter as tk
from tkinter.ttk import *

def subtract():
    #获取entry1的输入值
    value1 = float(entry1.get())
    # 获取entry2的输入值
    value2 = float(entry2.get())
    dic = {0:value1+value2,1:value1-value2,
           2:value1*value2,3:value1/value2}
    value3 = dic[combobox.current()]    #current()方法获取索引值
    #config()方法输出显示文本
    label.config(text=value3)

root = tk.Tk()
root.title('Combobox控件')
root.geometry('480x260')

#声明变量类型
var = tk.StringVar()
#创建组合框
combobox = Combobox(root,textvariable=var,values=('加','减','乘','除'))
combobox.grid(column=1,row=2,ipady=3,pady=1)

#创建输入框
entry1 = tk.Entry(root)
entry1.grid(column=0,row=0,ipady=3)
entry2 = tk.Entry(root)
entry2.grid(column=5,row=0,ipady=3)

# #创建按钮
button = tk.Button(root,text='计算',command=subtract)
button.grid(column=1,row=3)

#Label标签
label = tk.Label(root,text='')
label.grid(column=1,row=4)


root.mainloop()

运行效果如图所示:

十三、滑块Scale

Scale 用于创建一个标尺滑动条对象,用户可以移动标尺上的光标来设置数值。主要有以下属性:

       属性                                功能描述
        from                        起始值(最小可取值)
        label                        标签文字,默认为无
       length     控件实例宽(水平)或高(垂直方向),默认为100像素
        orient      控件呈现方向,VERTICAL或HORIZONTAL(默认)
  repeatdelay                鼠标延时(默认为300ms)
   resolution                分辨精度(即最小取值间隔)
state      状态,若设置state=DISABLED,则滑块控件实例不可用

       sliderlength

 滑块宽度,默认为30像素
          to                           终止值(最大可取值)
 tickinterval        标尺间隔,默认为0,若设置过小,则会重叠
     width                控件实例的宽度,默认为15像素
    variable返回数值类型,可为 IntVar(整数)、DoubleVar(浮点数) 或StringVar(字符串)


Scale还有这两个常用方法:

(1) get()      (  取得目前标尺上的光标值 )。

(2) set(value)      设置目前标尺上的光标值 )。

下面以相关代码展示(绑定鼠标事件):

import tkinter as tk

#绑定鼠标事件需要传入参数event
def get_values(event):
    text = '滑块取值:'+ str(scale.get())
    label.config(text=text)

#根窗口
root = tk.Tk()
root.title('Scale控件')
#窗口初始大小
root.geometry('480x260')

#设置返回数值类型浮点型
var = tk.DoubleVar()
scale = tk.Scale(root,variable=var,label='拖动滑块选值',\
                 length=240,from_=1.0,to=10.0,orient='vertical',\
                 tickinterval=3.0,resolution=0.1)
#将滑块固定在4.0的位置
scale.set(4.0)
#释放鼠标左键ButtonRelease-1,调用函数get_values
scale.bind('<ButtonRelease-1>',get_values)
scale.pack()

#Label标签显示输出滑块值
label = tk.Label(root,text='')
label.place(x=250,y=100)

root.mainloop()

运行效果如图:

十四、菜单Menu

Mnue控件用于将一系列我们需要操作的命令,进行分组划分,从而更加方便用户进行操作。

主要用法如下:

 较为常见的方法有:添加菜单分组 add_cascade()、添加菜单命令 add_coomand()、

添加分割线 add_separator(),如果需要去除菜单分组的默认虚线可以使用 tearoff=False命令。

相关代码展示:

import tkinter as tk

#根窗口
root = tk.Tk()
root.title('Menu控件')
root.geometry('380x240+600+350')


#主菜单(只能有一个)
main_menu = tk.Menu(root)
#分组菜单
file_menu = tk.Menu(main_menu,tearoff=False)    #tearoff=False去除分组里的默认虚线
main_menu.add_cascade(label='文件',menu=file_menu)
file_menu.add_command(label='新建')

#子菜单
file_menu2 = tk.Menu(main_menu,tearoff=False)
edit_menu.add_cascade(label='打开',menu=file_menu2)
file_menu2.add_command(label='最近文件')

#分割线
file_menu.add_separator()
file_menu.add_command(label='退出')

edit_menu = tk.Menu(tearoff=False)  #tearoff=False去除分组里的默认虚线
main_menu.add_cascade(label='编辑',menu=edit_menu)
edit_menu.add_command(label='剪切')
edit_menu.add_command(label='粘贴')

format_menu = tk.Menu(tearoff=False)    #tearoff=False去除分组里的默认虚线
main_menu.add_cascade(label='格式',menu=format_menu)
format_menu.add_command(label='自动换行')
format_menu.add_command(label='字体')

see_menu = tk.Menu(tearoff=False)
main_menu.add_cascade(label='查看',menu=see_menu)
see_menu.add_command(label='缩放')

help_menu = tk.Menu(tearoff=False)
main_menu.add_cascade(label='帮助',menu=help_menu)
help_menu.add_command(label='查看帮助')

#显示菜单
root.config(menu=main_menu)

root.mainloop()

运行效果如图:

十五、子窗体Toplevel

Toplevel用于新建一个窗体于主窗体上(我们称为子窗体),可设置的属性基本于主窗体一致,也能实现在上面布局控件。相关代码展示如下:

import tkinter as tk

#创建一个窗口
root = tk.Tk()
root.title('主窗口')
#窗口初始化大小
root.geometry('320x240')

def newwindow():
    root2 = tk.Toplevel(root)
    root2.geometry('320x240')
    root2.title('子窗口')
    lb2 = tk.Label(root2,text='我在子窗体上面')
    lb2.place(relx=0.4,rely=0.2)
    bt = tk.Button(root2,text='关闭',command=root2.destroy)
    bt.place(relx=0.5,rely=0.4)

button = tk.Button(root,text='弹出子窗口',command=newwindow)
button.place(relx=0.4,rely=0.4)
root.mainloop()

       运行效果如图所示:

十六、对话框

对话框主要分为:

消息对话框(要引入tkinter下的messagebox包);

输入对话框(要引入tkinter下的simpledialog包);

文件选择对话框(要引入tkinter下的filedialog包);

颜色选择对话框(要引入tkinter下的colorchooser包);

1、消息对话框

(1)确认、取消对话框 askokcancel()

import tkinter as tk
import tkinter.messagebox as box

def askokcancel():
    box.askokcancel(title='确认取消对话框',message='这是个确认取消对话框')

root = tk.Tk()
root.title('对话框')
root.geometry('480x260+500+300')

button = tk.Button(root,text='确认取消对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)

root.mainloop()

运行效果如图:

(2)是、否对话框 askquestion() ( 或askyesno() )

import tkinter as tk
import tkinter.messagebox as box

def askokcancel():
    box.askyesno(title='是否对话框',message='这是个是否对话框')

root = tk.Tk()
root.title('对话框')
root.geometry('480x260+500+300')

button = tk.Button(root,text='是否对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)

root.mainloop()

运行效果如图:

(3)重试、取消对话框 askretrycancel()

import tkinter as tk
import tkinter.messagebox as box

def askokcancel():
    box.askretrycancel(title='重试取消对话框',message='这是个重试取消对话框')

root = tk.Tk()
root.title('对话框')
root.geometry('480x260+500+300')

button = tk.Button(root,text='重试取消对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)

root.mainloop()

 运行效果如图:

 (4)是、否、取消对话框 askyesnocancel()

import tkinter as tk
import tkinter.messagebox as box

def askokcancel():
    box.askyesnocancel(title='是否取消对话框',message='这是个是否取消对话框')

root = tk.Tk()
root.title('对话框')
root.geometry('480x260+500+300')

button = tk.Button(root,text='是否取消对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)

root.mainloop()

 运行效果如图:

(5) 错误消息框 showerror()

import tkinter as tk
import tkinter.messagebox as box

def askokcancel():
    box.showerror(title='错误消息对话框',message='这是个错误消息对话框')

root = tk.Tk()
root.title('对话框')
root.geometry('480x260+500+300')

button = tk.Button(root,text='错误消息对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)

root.mainloop()

 运行效果如图:

 (6)信息提示框 showinfo()

import tkinter as tk
import tkinter.messagebox as box

def askokcancel():
    box.showinfo(title='信息提示对话框',message='这是个信息提示对话框')

root = tk.Tk()
root.title('对话框')
root.geometry('480x260+500+300')

button = tk.Button(root,text='信息提示对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)

root.mainloop()

 运行效果如图:

 (7)警告框 showwarning()

import tkinter as tk
import tkinter.messagebox as box

def askokcancel():
    box.showwarning(title='警告对话框',message='这是个警告对话框')

root = tk.Tk()
root.title('对话框')
root.geometry('480x260+500+300')

button = tk.Button(root,text='警告对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)

root.mainloop()

 运行效果如图:

 以上就是消息对话框,共有7个。

2、输入对话框

先导入包:

import tkinter.simpledialog

(1)askstring() 对话框(接收字符串输入)

import tkinter as tk
import tkinter.simpledialog as dia

def askokcancel():
    a = dia.askstring(title='askstring对话框',prompt='请输入一串内容:')
    print(a)

root = tk.Tk()
root.title('输入对话框')
root.geometry('480x260+500+300')

button = tk.Button(root,text='askstring对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)

root.mainloop()

 运行效果如图:

(2)askinteger() 对话框(接收整数输入)

import tkinter as tk
import tkinter.simpledialog as dia

def askokcancel():
    a = dia.askinteger(title='askinteger对话框',prompt='请输入整数内容:')
    print(a)

root = tk.Tk()
root.title('输入对话框')
root.geometry('480x260+500+300')

button = tk.Button(root,text='askinteger对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)

root.mainloop()

 运行效果如图:

(3) askfloat() 对话框 (接收浮点数输入)

import tkinter as tk
import tkinter.simpledialog as dia

def askokcancel():
    a = dia.askfloat(title='askfloat对话框',prompt='请输入浮点数:')
    print(a)

root = tk.Tk()
root.title('输入对话框')
root.geometry('480x260+500+300')

button = tk.Button(root,text='askfloat对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)

root.mainloop()

 运行效果如图:

3、文件选择对话框

先导入包:

import tkinter.filedialog

弹出文件选择对话框,主要有以下常用方法:

方法作用返回数据类型
askopenfilename()打开一个文件文件名字符串(且包含文件路径)
askopenfilenames()打开多个文件元组
asksaveasfilename()保存文件文件名字符串(且包含文件路径)

代码展示:

import tkinter as tk
import tkinter.filedialog as dia

def askokcancel():
    file1 = dia.askopenfilename()
    file2 = dia.askopenfilenames()
    file3 = dia.asksaveasfilename()
    print(type(file1),file1,'\n',type(file2),file2,'\n',type(file3))

root = tk.Tk()
root.title('文件选择对话框')
root.geometry('480x260+500+300')

button = tk.Button(root,text='文件选择对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)

root.mainloop()

运行结果如图:

4、颜色选择对话框

先导入包:

import tkinter.colorchooser

使用 askcolor()弹出颜色选择对话框,askcolor()返回的数据类型是一个元组

import tkinter as tk
import tkinter.colorchooser as color

def askokcancel():
    a = color.askcolor()
    print(type(a))
root = tk.Tk()
root.title('颜色选择对话框')
root.geometry('480x260+500+300')

button = tk.Button(root,text='颜色选择对话框',command=askokcancel)
button.place(width=100,height=50,y=100,x=200)

root.mainloop()

十七、绑定事件

将需要执行的事件与函数绑定,通过鼠标或键盘点击来响应触发函数执行,其用法如下:

控件实例.bind('<事件代码>',函数名)    #注意函数名后不接括号

常见的事件代码如下所示: 

事件事件代码其他
单击鼠标右键<ButtonPress-3>可以简写为<3>、<Button-3>
单击鼠标中键<ButtonPress-2>可以简写为<2>、<Button-2>
单击鼠标左键<ButtonPress-1>可以简写为<1>、<Button-1>
释放鼠标右键<ButtonRelease-3>
释放鼠标中键<ButtonRelease-2>
释放鼠标左键<ButtonRelease-1>
按住鼠标右键移动<B3-Motion>
按住鼠标中键移动<B2-Motion>
按住鼠标左键移动<B1-Motion>
双击鼠标左键<Double-Button-1>
鼠标进入控件实例<Enter>
鼠标离开控件实例<Leave>
拨动鼠标滚轮<MouseWheel>
键盘任意键<Key>
回车<Return>
空格<Space>
字母和数字<Key-字母>
功能键<Fn> (如:<F1> <F2>等)
方向键<Right>、<Left>、<Up>、<Down>
组合键键名之间用减号 - 连接需要注意大小写

注意:在进行事件与函数绑定的时候,需要为自定义的函数传入参数 event。event常见属性如下:

属性作用
event.x或event.y  (x,y要小写)绑定事件触发时,获取相对于控件实例的左边距离x,上边距离y (单位:像素)
event.root_x或event.root_y (x,y要小写)获取相对于屏幕左上角的坐标值  (单位:像素)
keysysm字符(或字符型)按键名称
keysysm_num按键的十进制ASCII码值
char可显示的字符

下面以列表框那节的例子(新加绑定鼠标左键松开)演示一下:

import tkinter as tk

#单击鼠标左键响应事件
def ini():
    teachers = ['张三','李五','王六']
    course = ['python','java','c++']
    for i in teachers:
        lisbox1.insert(0,i)

    for j in course:
        lisbox2.insert('end',j)

def add(event):
    s = '老师:'+lisbox1.get(lisbox1.curselection())+','+'教授课程:',\
            lisbox2.get(lisbox1.curselection())
    lisbox3.insert(0,s)

root = tk.Tk()
root.geometry('480x300')
root.title('绑定事件')

#创建Frame框架
frame1 = tk.Frame(root,relief='sunken',)
frame1.place(x=0,width=150,height=250)
frame2 = tk.Frame(root,relief='sunken')
frame2.place(x=150,width=150,height=250)
frame3 = tk.Frame(root)
frame3.place(x=300,width=250,height=250)


#创建列表框
lisbox1 = tk.Listbox(frame1,font='微软雅黑')
#注意    这里设置的width=150,height=500,是被第九行设置的宽度和高度限制的,
#       虽然这里设置了500的高,但实际只能显示250
lisbox1.place(width=150,height=500)
#绑定鼠标左键松开事件
lisbox1.bind('<ButtonRelease-1>',add)
lisbox2 = tk.Listbox(frame2,font='微软雅黑')
lisbox2.place(width=150,height=500)
lisbox3 = tk.Listbox(frame3,font='微软雅黑')
lisbox3.place(width=250,height=500)


ini()
root.mainloop()

效果如图所示:

注意:在绑定鼠标事件的时候,建议绑定鼠标左键松开(<ButtonRelease>),而不是绑定鼠标左键点击(<ButtonPress-1>),这样会很打脑壳,因为我一开始就是这样弄的,给大家看下,很麻烦。

 

如上图我第一次点击‘张三’,但却没有显示在右侧的列表框

接着,又点击了两次 ‘李五’,这时右侧有显示,但明显不对

 总结:

以上这些就是Tkinter模块学习第三部分要分享的了,到这里Tkinter模块学习也差不多结束了,画布的话要后面在学了,因为是最后一部分了,内容比较之前的可能有点多,又是初学,内容难免有不严谨或错误之处,希望大家可以来评论留言之处,我们一起学习,谢谢大家看我写的小东西,谢谢!

  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值