Python ---(十五)Tkinter窗口组件:OptionMenu

上一篇:Python —(十四)Tkinter窗口组件:Menubutton


                                          The Tkinter OptionMenu Widget

##简介

OptionMenu(选择菜单)事实上是下拉菜单的改版,它的发明弥补了 Listbox 组件无法实现下拉列表框的遗憾。

##用法

创建一个选择菜单非常简单,只需要它一个 Tkinter 变量(用于记录用户选择了什么)以及若干选项即可:

from tkinter import *

root = Tk()

variable = StringVar()
variable.set("one")

w = OptionMenu(root,variable,"one","two","three")
w.pack()


mainloop()

Python ---(十五)Tkinter窗口组件:OptionMenu_第1张图片Python ---(十五)Tkinter窗口组件:OptionMenu_第2张图片
   (解析:先来创建一个tkinterd的变量,variable = StringVar(),然后再设置一下变量的默认值,接着实例化一个OptionMenu对象,后面的参数是可变参数,根据需要定义个数,再把他pack出来就可了

下面再来一个如何将很多项添加到选择菜单中,就是很多选项在一个列表或者元组中,如何将他们添加到 OptionMenu 菜单中

from tkinter import *


OPTIONS = [
    "aaa",
    "bbb",
    "ccc",
    "ddd",
    "eee",
    "fff"
    ]


root = Tk()

variable = StringVar()
variable.set(OPTIONS[0])

w = OptionMenu(root,variable,*OPTIONS)
w.pack()



mainloop()

Python ---(十五)Tkinter窗口组件:OptionMenu_第3张图片
   (解析:我们知道,OptionMenu后面的选项是可变参数, 那假设前面拿到一个列表,这个列表很长,那现在问题是如何那个列表放进去,因为那个选项是可变参数,不可以直接把直接把列表扔进去,不然他会把整个列表当做一个选项,而不会说把列表自动拆开,自动拆开的话其实直接在前面加个*就可了,星号有个解包的功能

   星号(*)作为形参的时候是起到“打包”的作用,相反,作为实参的时候是起到“解包”的作用。

一、星号(*)作为形参,表示调用可变参数函数:

通过在形参前加一个星号(*)或两个星号(**)来指定函数可以接收任意数量的实参。


def fun1(*args):       
        print(type(args)) 
        print(args)
        
fun1(1, 2, 3, 4, 5)
 
# 输出:
# <class 'tuple'>
# (1, 2, 3, 4, 5)
def fun2(**args):
        print(type(args))
        print(args)
        
fun2(a=1, b=2, c=3, d=4, e=5)
 
# 输出:
# <class 'dict'>
# {'e': 5, 'a': 1, 'c': 3, 'd': 4, 'b': 2}

从两个示例的输出可以看出:当参数形如 *args 时,传递给函数的任意个实参会按位置打包成一个元组(tuple);
当参数形如 **args 时,传递给函数的任意个 key = value 实参会被包装进一个字典(dict)。

二、星号(*)作为实参时,表示通过解包参数调用函数

有打包就有解包,通过在实参前加一个星号(*)或两个星号(**)来对列表(list)、元组(tuple)或字典(dict)进行解包:

>>> a = [1, 2, 3, 4, 5]
>>> b = (1, 2, 3, 4, 5)
>>> fun1(*a)
(1, 2, 3, 4, 5)
>>> fun1(*b)
(1, 2, 3, 4, 5)
>>> c = {'one':1, 'two':2, 'three':3}
>>> fun2(**c)
{'two': 2, 'one': 1, 'three': 3}
>>>

   总结:一个星号(*)用来打包和解包序列,两个星号(**)用来打包和解包字典。

你可能感兴趣的:(Python)