当前位置:首页 » tkinter » 正文

tkinter选项菜单OpintionMenu组件,带菜单的按钮

创建一个默认的选项菜单OpintionMenu

这篇文章来讲一下OpintionMenu(选项菜单)组件,这个组件感觉是按钮跟菜单的组合体,点击组件,会出现一个下拉菜单,你从众多选项中选择一下以供程序使用。

创建语法: OpintionMenu(父组件,绑定变量,选项1,选项2……)

例如:OpintionMenu(父组件, var, '中国', '美国', '英国')

下面代码创建一个选项菜单:

from tkinter import *
root=Tk()
root.geometry('150x120+888+444')
 
var=StringVar() # 字符串变量
op1=OptionMenu(root,var,'中国','美国','英国')
op1.pack()
 
print(op1.keys()) # 输出组件的选项参数
 
root.mainloop()

运行结果:

              1.PNG

启动后,print(op1.keys()) 还会输出组件的选项参数:

['activebackground', 'activeforeground', 'anchor', 'background', 'bd', 'bg', 'bitmap', 'borderwidth',

'cursor', 'direction', 'disabledforeground', 'fg', 'font', 'foreground', 'height', 'highlightbackground', 'highlightcolor', 'highlightthickness', 'image', 'indicatoron', 'justify', 'menu', 'padx', 'pady', 'relief', 'compound', 'state', 'takefocus', 'text', 'textvariable', 'underline', 'width', 'wraplength']

在这里,我不再一一讲解这些参数的意思了,这个参数在之前讲解的组件基本上遇到过。这个组件我主要讲解一下如果获取用户的选项值以及可能大家想了解的知识。

获取选择菜单的选中的选项值的方法

如果选项比较多,在代码里,可以创建选项菜单前,先把选项以元组的方法列出来。下面的代码我们用绑定变量var的set方法来为组件初设一个值,然后用var.get()获取组件目前的选项值。

from tkinter import *
 
def selectjob():
    print(var.get()) # 用get()方法得到组件目前的值
 
root=Tk()
root.geometry('150x125+888+444')
 
var=StringVar() # 字符串变量
tuple_op=('中国','美国','英国','法国') # 先把选项创建一个元组
var.set(tuple_op[0]) # 为组件设一个初始值
 
op1=OptionMenu(root,var,*tuple_op) # 选项引用元组时,前面要加*
op1.pack()
 
but1=Button(root,text="输入目前值",command=selectjob)
but1.pack(side=BOTTOM)
 
root.mainloop()

运行结果:      丶丌皛

2.PNG

启动后,点击下面按钮,会输出选项菜单的当前值。


但是,如果想即时得到选项菜单的当前值应该怎么做呢?在创建选项菜单时,你可以像按钮一样加入一个参数command,这个参数可以绑定一个函数,你利用这个函数可以即时得到选项文本。

以下是全部代码:

from tkinter import *
 
def selectjob(cs):  # 一定要加参数
    print('var.get()=',var.get()) # 用get()方法得到组件目前的值 
    print('cs=',cs) # 看看参数的值
 
root=Tk()
root.geometry('150x125+888+444')
 
var=StringVar() # 字符串变量
tuple_op=('中国','美国','英国','法国') # 先把选项创建一个元组
var.set(tuple_op[0]) # 为组件设一个初始值
 
op1=OptionMenu(root,var,*tuple_op,command=selectjob) # 选项引用时,元组前面要加*
op1.pack()
 
root.mainloop()

运行结果证明,用变量.get()方法和直接输入绑定函数的参数值,都可以即时得到用户的选择项。

设置菜单选项的颜色,字体,图片等

其实,OptionMenu组件比较有用的知识就是上述所讲解的。其它的知识,比如,组件除菜单外,你可以把OptionMenu组件当成一个按钮来设置:

如: op1.config(font=('黑体',20),fg='red') # 设置字体及颜色

代码如下:

from tkinter import *
 
root=Tk()
root.geometry('150x125+888+444')
 
var=StringVar() # 字符串变量
tuple_op=('中国','美国','英国','法国') # 先把选项创建一个元组
var.set(tuple_op[0]) # 为组件设一个初始值
 
op1=OptionMenu(root,var,*tuple_op) # 选项引用时,前面要加*
op1.pack()
 
op1.config(font=('黑体',20),fg='red') # 设置字体及颜色
 
root.mainloop()

运行结果:

    3.PNG

你也可以为optionMenu设置图片,如

img1=PhotoImage(file='16-1.png') # 创建图像对象(图片自己先准备好)

op1.config(image=img1,compound='left') # 组件加入图像,图像靠左

代码如下

from tkinter import *
 
root=Tk()
root.geometry('150x125+888+444')
 
var=StringVar() # 字符串变量
tuple_op=('中国','美国','英国','法国') # 先把选项创建一个元组
var.set(tuple_op[0]) # 为组件设一个初始值
 
op1=OptionMenu(root,var,*tuple_op) # 选项引用时,前面要加*
op1.pack()
 
op1.config(font=('黑体',20),fg='red') # 设置字体及颜色
 
img1=PhotoImage(file='16-1.png') # 创建图像对象
op1.config(image=img1,compound='left') # 组件加入图像,图像靠左
 
root.mainloop()

运行结果:

4.PNG

按钮Button组件的知识基本上都可以用于OptionMenu设置,不清楚的,再回头去看看我写的文章。

这里我讲一下,如何设置菜单,写一些代码,起个抛砖引玉的作用,大家自己多动手写代码,自行测试。

比如,我已经设置OptionMenu组件上面的按钮字体为20大小的黑体,而菜单部分如果没有设置,那菜单的字体就显得太小,字体也不统一,所以我们要把菜单的字体也设置一下。代码是:

op1['menu'].config(font=('黑体',20)) 设置菜单的字体及大小

全部代码如下:

from tkinter import *
 
root=Tk()
root.geometry('150x125+888+444')
 
var=StringVar() # 字符串变量
tuple_op=('中国','美国','英国','法国') # 先把选项创建一个元组
var.set(tuple_op[0]) # 为组件设一个初始值
 
op1=OptionMenu(root,var,*tuple_op) # 选项引用时,前面要加*
op1.pack()
 
op1.config(font=('黑体',20),fg='red') # 设置字体及颜色
 
op1['menu'].config(font=('黑体',20)) # 设置菜单字体和大小
 
root.mainloop()

运行结果:

5.PNG

结果证明,这个方法来设置菜单是可行的。其它,如设置字体颜色,菜单背景颜色等,我稍加测试了一下,都是成功的,但其它方面的测试我没有时间继续,大家有兴趣,自行测试吧。

 说说在ttk模块下可能出现的问题

这里,我倒是要先说说以后要讲解的ttk知识,因为在ttk模块下,菜单选项OptionMenu在创建语法稍有不同,如果你还是用以前的创建方式,很有可能出现问题。

最常出现的问题就是,运行后,菜单选项OptionMenu的第1项,在选取别的选项后,永远的消失了。以下是在tkinter模块下创建的代码,大家先运行一下,应该没有任何问题,然后,把第2行代码反注释,让导入ttk模块运行,你就发现我所说的第一项永远消失的现象。

from tkinter import *
# from tkinter.ttk import *
 root=Tk()
 
var=StringVar() # var为op1准备绑定的变量
op1=OptionMenu(root,var,'中国','美国','英国') # 选项为:中国,美国,英国
var.set('中国') # 默认选取一项
op1.pack()
 
root.mainloop()

  

解决办法是把创建选项菜单的创建代码要改一下,改后的代码是:

from tkinter import *
from tkinter.ttk import *
root=Tk()
 
var=StringVar()
op1=OptionMenu(root,var,'中国','中国','美国','英国') # 前一个中国是默认选择项,后一个中国是选项1
op1.pack()
 
root.mainloop()


改进的原因是,在ttk模块下,创建菜单选项OptionMenu的语法已经变成了:

OptionMenu(父组件,绑定变量,默认选择项,选项1,选项2…….)

在tkinter模块下的创建语法在下面,大家对比一下:

OptionMenu(父组件,绑定变量,选项1,选项2…….)

 

很明显,ttk模块下创建的语法多了一个参数叫:默认选择项。

 

好了,菜单选项OptionMenu组件就讲到这里,下一篇文章,我来讲解一下比较容易学的组件LableFrame



来源:济亨网

本文链接:http://wb98.com/post/323.html

    << 上一篇 下一篇 >>

    湘公网安备 43011102000514号 - 湘ICP备08100508号