Python选项菜单“;覆盖“;lambda变量

Python选项菜单“;覆盖“;lambda变量,python,tkinter,optionmenu,Python,Tkinter,Optionmenu,我有一个窗口,其中包含来自矩阵的多达12行数据。因为我使用循环,所以我必须使用“变量标签”。其中一个变量标签(有八个)使用选项菜单允许用户从列表中进行选择,这里的示例是“0”、“1”、“2”、“3” 我在冒号前面使用I=my_num,因为在12行中,用户可能正在更改第3行 问题是,无论我做什么,“print(f'{I},{gn.get()},{final_-lotster}')”语句都会用“gn”值“覆盖”“I”值 将第一行的此变量更改为值“3”应如下所示: 1, 3, {1: 'B@Griff

我有一个窗口,其中包含来自矩阵的多达12行数据。因为我使用循环,所以我必须使用“变量标签”。其中一个变量标签(有八个)使用选项菜单允许用户从列表中进行选择,这里的示例是“0”、“1”、“2”、“3”

我在冒号前面使用
I=my_num
,因为在12行中,用户可能正在更改第3行

问题是,无论我做什么,
“print(f'{I},{gn.get()},{final_-lotster}')”
语句都会用“gn”值“覆盖”“I”值

将第一行的此变量更改为值“3”应如下所示: 1, 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}')
但实际上返回的是: 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}')

选项菜单
执行带有一个参数的
命令
——选定项目的索引——并将其分配给代码中的
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()

我看不到任何
-loopPython有字典来保存变量,如
数据['looster\u gun%s'%my\u num]=…
,以后您可以用同样的方式打印(数据['looster\u gun%s'%my\u num]),
-您不必使用
globals()
创建最小的工作代码,以便我们可以运行它并查看问题。我在代码中看不到任何
循环,也无法运行它,因此我看不出问题出在哪里。您只创建了一个
选项菜单
,因此您在
I=my_num
中只有一个值-您不能有三个不同的值-您误解了某些内容。@furas,我知道,因为我必须在参加其他例行活动后不断销毁这些标签。谢谢。:-)我在一个循环中运行它,标签从花名册1转到花名册12。我还让这个例程的其他元素在不使用OptionMenu的情况下工作,所以我知道这是一个很好的代码。问题是在使用OptionMenu时,“i”值始终是“Gunny”值的值。这就是我的要命。如果你有一个全局()的解决方案,我洗耳恭听。由于窗口是如何构建的,我必须不断地删除和重画元素,总是在调用其他例程之后。一旦我脱离了创建它们的例程,当我回到第一个例程时,“.destroy()”函数不再工作,除非它是全局的。你必须在所有函数/方法之外定义字典,然后它就是全局字典,你可以在函数/方法内使用它,即使不使用word
global
。最终,您可以将此字典作为参数发送给函数,该函数必须将元素添加到字典中。