Python OptionMenu "overwrites" lambda 变量



我有一个窗口,其中包含来自矩阵的多达十二行数据。因为我使用循环,所以我必须使用"变量标签"。其中一个变量标签有八个(使用选项菜单允许用户从列表中选择,这里的例子是"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}')

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

您不会在 -loop 中运行代码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()

相关内容

  • 没有找到相关文章

最新更新