py 第三十四天 Tkinter20:OptionMenu

一、介绍

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

二、使用

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

from tkinter import *
root = Tk()
v = StringVar()
v.set('水果')
om = OptionMenu(root,v,'香蕉','苹果','桃子')
om.pack()
mainloop()

要获得用户选择的内容,使用 Tkinter 变量的 get()方法即可:

from tkinter import *
root = Tk()
v = StringVar()
v.set('水果')
om = OptionMenu(root,v,'香蕉','苹果','桃子')
om.pack()
def show():
    print(v.get())
Button(text = '你猜我选了什么?',command = show).pack()
mainloop()

下边例子演示如何将很多选项添加到选择菜单中:

from tkinter import *

OPTIONS = [
    "California",
    "458",
    "FF",
    "ENZO",
    "LaFerrari"
    ]

root = Tk()

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

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

def callback():
    print(variable.get())

Button(root, text="点我", command=callback).pack()

mainloop()

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

三、星号*

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

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

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)

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

有打包就有解包,通过在实参前加一个星号*或两个星号**来对列表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}
>>> 

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

https://fishc.com.cn/forum.php?mod=viewthread&tid=61338&extra=page%3D1%26filter%3Dtypeid%26typeid%3D604

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。