Tkinter 組件詳解之OptionMenu


OptionMenu(選擇菜單)事實上是下拉菜單的改版,它的發明彌補了 Listbox 組件無法實現下拉列表框的遺憾。

 

用法

創建一個選擇菜單非常簡單,只需要它一個 Tkinter 變量(用於記錄用戶選擇了什么)以及若干選項即可:

import tkinter as tk

root = tk.Tk()

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

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

root.mainloop()


要獲得用戶選擇的內容,使用 Tkinter 變量的 get() 方法即可:

import tkinter as tk

root = tk.Tk()

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

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

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

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

root.mainloop()


下邊例子演示如何將很多選項添加到選擇菜單中:

import tkinter as tk
 
OPTIONS = [
        "Wuhan",
        "Beijing",
        "Shanghai",
        "Tianjin",
        "Aomen",
        "Xianggang",
        "Hankou"
        ]
 
root = tk.Tk()
 
variable = tk.StringVar()
variable.set(OPTIONS[0])
 
w = tk.OptionMenu(root, variable, *OPTIONS) #*號有一個解包的功能,如果沒有 * 號,就把整個列表當做一個選項了
w.pack()
 
def callback():
    print(variable.get())
 
tk.Button(root, text="點我", command=callback).pack()
 
root.mainloop()

 


注意:星號(*)作為形參的時候是起到“打包”的作用,相反,作為實參的時候是起到“解包”的作用。

一、星號(*)作為形參,表示調用可變參數函數:

通過在形參前加一個星號(*)或兩個星號(**)來指定函數可以接收任意數量的實參。

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}
>>> 

 

 



原文鏈接:https://blog.csdn.net/qq_41556318/article/details/85274122


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM