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()
我有一个 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()