我有一个窗口,其中最多包含来自矩阵的十二行数据。因为使用循环,所以必须使用“变量标签”。这些变量标签之一(共有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}')
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()