Python OptionMenu“覆盖” lambda变量[关闭]

问题描述 投票:-3回答:1

我有一个窗口,其中最多包含来自矩阵的十二行数据。因为使用循环,所以必须使用“变量标签”。这些变量标签之一(共有8个)使用选项菜单允许用户从列表中进行选择,此处的示例为“ 0”,“ 1”,“ 2”,“ 3”。

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

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

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

但实际上会返回以下内容: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}')
python tkinter optionmenu
1个回答
0
投票

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)

BTW:Python有字典来保存这样的变量

roster_gun = dict()

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

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

© www.soinside.com 2019 - 2024. All rights reserved.