我在另一篇文章中也有同样的问题。我曾经阅读过这篇文章和答案,但没有注意到这两个选项菜单之间的细微差别。所以,尽管我是Python和tkinter的新手,我也要尝试回答这个问题。
正如@Bryan Oakley所回答的那样,是的,文档字符串显示在使用ttk.OptionMenu而不是tk.OptionMenu时需要一个“additional”必需参数。如果你轻率地将声明从ttk.OptionMenu改回tk.OptionMenu,这种差异会破坏(或至少混乱)你的菜单。这是因为tk.OptionMenu不需要声明“default”选项。如果你因某种原因将ttk.OptionMenu改回tk.OptionMenu并在声明中保留“default”参数,它将复制OptionMenu中的第一个选项。我一直在苦苦思考为什么这两者的行为方式不完全相同。在我个人看来,这不应该是这种情况。如果有什么不同,那么“default”参数应该是tk.OptionMenu和ttk.OptionMenu中的关键字,以便兼容。也许我错了,但这是我现在的看法。
请参见下面的代码以演示这一点:
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
optionList1 = ('a', 'b', 'c')
optionList2 = ('d', 'e', 'f')
optionList3 = ('g', 'h', 'j')
optionList4 = ('1', '2', '3')
optionList5 = ('4', '5', '6')
optionList6 = ('7', '8', '9')
optionList7 = ('z', 'x', 'y')
v1 = tk.StringVar()
v2 = tk.StringVar()
v3 = tk.StringVar()
v4 = tk.StringVar()
v5 = tk.StringVar()
v6 = tk.StringVar()
v7 = tk.StringVar()
v2.set(optionList2[1])
v3.set(optionList3[2])
v5.set(optionList5[1])
om1 = tk.OptionMenu(root, v1, *optionList1)
om2 = tk.OptionMenu(root, v2, optionList2[0], *optionList2)
om3 = tk.OptionMenu(root, v3, *optionList3)
om4 = tk.OptionMenu(root, v4, optionList4[0], *optionList4)
om5 = ttk.OptionMenu(root, v5, *optionList5)
om6 = ttk.OptionMenu(root, v6, *optionList6)
om7 = ttk.OptionMenu(root, v7, optionList7[2], *optionList7)
om1.pack()
om2.pack()
om3.pack()
om4.pack()
om5.pack()
om6.pack()
om7.pack()
root.mainloop()
我知道代码可能有点丑陋,如果你确实想要更改它,那就去尝试吧。:)