Python 选项菜单 "overwrites" lambda 变量

Python OptionMenu "overwrites" lambda variable

我有一个 window,其中包含矩阵中最多十二行的数据。因为我使用了一个循环,所以我必须使用一个 "variable label." 这些变量标签(其中有八个)使用一个 Option Menu 来允许用户从列表中选择,这里的例子是“0”,“ 1", "2", "3".

我在冒号前使用 i=my_num 因为在十二行中,用户可能会更改第三行。

问题是,无论我做什么,"print(f'{i}, {gn.get()}, {final_roster}')" 语句都会 "overwrite" "i" 值与 "gn" 值。

将第一行的这个变量更改为值“3”应该如下所示: 1, 3, {1: 'B@Griffin@GRF-3M@1521@1@1521@A@A@N@5@4'}

但实际上 returns 这个: 3, 3, {1: 'B@Griffin@GRF-3M@1521@1@1521@A@A@N@5@4'}

from tkinter import *
from tkinter import Label
from tkinter import messagebox
from tkinter import LEFT
from tkinter.ttk import Label, Entry
from tkinter.filedialog import askopenfilename
from tkinter import Tk, Canvas, Frame, BOTH
import win32api


root = Tk()

def NewList(root):
    rndwin = Toplevel(root)
    rndwin.geometry("775x360+10+10")
    rndwin.title("Define Selection Parameters")
    pick3 = [
        "0",
        "1",
        "2",
        "3"
    ]
    # This line is actually in a loop and draws up to twelve of them.
    globals()['roster_gun%s' % my_num] = OptionMenu(rndwin, gunnry, *pick3, command=lambda i=my_num: gunneryv(root, rndwin, i, gunnry, final_roster, bv_array, roster_sz, base_files))
    globals()['roster_gun%s' % my_num].place(x=10, y=10)

def gunneryv(root, rndwin, i, gn, final_roster, bv_array, roster_sz, base_files):
    print(f'{i}, {gn.get()}, {final_roster}')

OptionMenu 使用一个参数执行 command - 所选项目的索引 - 并将其分配给代码中的 i

您没有 运行 在 for 循环中编写代码,因此您不需要使用 i=my_num - 您可以直接将其放入

command=lambda selected: gunneryv(root, rndwin, my_num, gunnry, final_roster, bv_array, roster_sz, base_files)

但是如果你要在 for 循环中 运行 那么你可能不得不使用 i=my_num 但作为第二个参数

command=lambda selected, i=my_num: gunneryv(root, rndwin, i, gunnry, final_roster, bv_array, roster_sz, base_files)

顺便说一句:Python 有字典来保存这样的变量

roster_gun = dict()

roster_gun[my_num] = tk.OptionMenu(...)
roster_gun[my_num].place(x=10, y=10)

而且您不必为此使用 globals()