按字母顺序对 Tkinter 选项菜单进行排序?

Sort a Tkinter optionmenu alphabetically?

我正在尝试在 Tkinter 中制作一个按字母顺序列出其数据的 OptionMenu,但我不知道该怎么做。

这是我的 OptionMenu 数据集代码。 (这将随着我开发程序而扩展)。

data={
'Actually Additions Atomic Reconstructor',
'Advanced Mortars',
'Artisan Worktables',
'Extra Utilities Crusher',
'Extra Utilities Resonator',
'Initial Inventory',
'JEI Hide',
'JEI RemoveAndHide',
'Ore Dictionary Add',
'Ore Dictionary Create',
'Ore Dictionary Remove',
'Seed Drops'
}

这是我的 OptionMenu 代码。

var = tkinter.StringVar()
var.set('Advanced Mortars')
p = tkinter.OptionMenu(window, var, *data)
p.config(font='Helvetica 12 bold')
p.pack()

每次我 运行 代码并打开 OptionMenu 时,所有内容都是随机加扰的。如何按字母顺序排序?

由于data是一个集合,是python中的一个无序集合,所以数据总是会打乱的。由于 data 看起来已经排序,解决此问题的一个简单方法是将 data 更改为列表,这是一个有序集合:

data=[
     'Actually Additions Atomic Reconstructor',
     'Advanced Mortars',
     ...
     ]

如果你的数据必须是一组开始,你也可以预先用 sorted():

排序
data = sorted(data)

你的代码 运行 在我 运行 时没问题:

from tkinter import *

data={
      'Actually Additions Atomic Reconstructor',
      'Advanced Mortars',
      'Artisan Worktables',
      'Extra Utilities Crusher',
      'Extra Utilities Resonator',
      'Initial Inventory',
      'JEI Hide',
      'JEI RemoveAndHide',
      'Ore Dictionary Add',
      'Ore Dictionary Create',
      'Ore Dictionary Remove',
      'Seed Drops'
     }

data = sorted(data)

master = Tk()

var = StringVar(master)
var.set('Advanced Mortars')
p = OptionMenu(master, var, *data)
p.config(font='Helvetica 12 bold')
p.pack()

谢天谢地,这个解决方案相当简单直观。您所要做的就是在传递参数时添加一个 sorted() :

var = tkinter.StringVar()
var.set('Advanced Mortars')
p = tkinter.OptionMenu(window, var, *sorted(data))
p.config(font='Helvetica 12 bold')
p.pack()

只需确保将 sorted() 放在 * splat 运算符中,因为 sorted() 需要应用于数据变量等列表,但 sorted(*data) 它实际上将 *data 作为一堆单独的变量,所以 sorted() 不起作用。