Wolfram mathematica 当字段大小不够时,如何在弹出菜单中使项目更紧凑(减少空白)

Wolfram mathematica 当字段大小不够时,如何在弹出菜单中使项目更紧凑(减少空白),wolfram-mathematica,Wolfram Mathematica,我正在尝试设置弹出菜单的格式,注意到当我将FieldSize->7设置为7时,菜单中的一个项目将换行,即使在我看来,右边有足够的空白 当我增加FieldSize->8时,FieldSize现在就足够了,并且没有菜单项会环绕 但在我看来,现在已经浪费了一定数量的空白。我尝试了弹出菜单的许多选项,例如内容填充,以及使项目更紧凑的选项,但是当我将fieldSize设置回7时,它坚持包装这一项 这可能是字体风格的问题吗?我想知道是否有人会在这件事上耍花招 这是代码,并显示了问题 Manipulate[

我正在尝试设置弹出菜单的格式,注意到当我将FieldSize->7设置为7时,菜单中的一个项目将换行,即使在我看来,右边有足够的空白

当我增加FieldSize->8时,FieldSize现在就足够了,并且没有菜单项会环绕

但在我看来,现在已经浪费了一定数量的空白。我尝试了弹出菜单的许多选项,例如内容填充,以及使项目更紧凑的选项,但是当我将fieldSize设置回7时,它坚持包装这一项

这可能是字体风格的问题吗?我想知道是否有人会在这件事上耍花招

这是代码,并显示了问题

Manipulate[
opt,

Control[{ {opt,0,Style["display",11]},
  {0->Text@Style["bob only",Small],
  4->Text@Style["L + bob",Small],
  1->Text@Style["L only",Small],
  2->Text@Style["L resolved",Small],
  3->Text@Style["L + resolved",Small],
  5->Text@Style["L resolved + bob",Small],
  6->Text@Style["show all above",Small]        
},
ControlType->PopupMenu,FieldSize->7,
ImageMargins->0,
FrameMargins->0,ContentPadding->True,ImageSize->Small}]

]
这是我打开菜单时的屏幕截图

现在我将FieldSize->8更改为:

但是请注意上面,我认为右边有太多的空白,FieldSize->7应该足够宽,使该项不被环绕

我试过FontFamily->“时代”和“信使”,效果相同:

Manipulate[opt,
Control[{ {opt,0,Style["display",11]},
{0->Text@Style["bob only",Small,FontFamily->"Courier"],
4->Text@Style["L + bob",Small,FontFamily->"Courier"],
1->Text@Style["L only",Small,FontFamily->"Courier"],
2->Text@Style["L resolved",Small,FontFamily->"Courier"],
3->Text@Style["L + resolved",Small,FontFamily->"Courier"],
5->Text@Style["L resolved + bob",Small,FontFamily->"Courier"],
6->Text@Style["show all above",Small,FontFamily->"Courier"]
},ControlType->PopupMenu,FieldSize->7,
ImageMargins->0,FrameMargins->0,ContentPadding->True,ImageSize->Small}]
]
事实上,现在有了Courier,我不得不转到FieldSize->9,这样一个字段现在就不需要包装了。所以Courier的情况最糟

有没有可能使场地比现在更紧

编辑1: 回复mr向导:

编辑2:

使用FieldSize->Automatic,使整个菜单大小根据所选项目更改大小

Manipulate[opt,Control[{{opt,0,Style["display",11]},
{0->Style["bob only",Small],
1->Style["L + bob",Small],
2->Style["L only",Small],
3->Style["L resolved",Small],
4->Style["L + resolved",Small],
5->Style["L resolved + bob",Small],
6->Style["show allabove",Small]},
ControlType->PopupMenu,FieldSize->Automatic,
ImageMargins->0,FrameMargins->0,ImageSize->Small}]]
12月21日凌晨1时更新

下图显示了如何使用Leonid宏方法使其更简单 通过使用构建UI并减少UI对象自定义的代码重复 宏的定义。我目前大量使用这种方法,并且有一个超过 4000行仅用于用户界面本身,我不可能用老方法来实现, 因为我会失去对事情的控制

宏使管理代码布局更容易,更重要的是,现在我 可以通过编辑小代码而不是 宏表示的较大代码。没有GUI生成器,宏 是次好东西:)

这是上面的代码

Manipulate[

 Row[{opt1, opt2}],

 Evaluate@With[{
    popUpMenu1Options = MenuStyle -> {Red},
    popUpMenu2Options = MenuStyle -> {Black},
    popUpMenuCommonOptions = {BaseStyle -> 20, ImageMargins -> 0, 
      FrameMargins -> 0, ImageSize -> All}
    },

   With[{

     menu1 = PopupMenu[Dynamic[opt1],
       {"A", "B"
        }, Sequence[popUpMenu1Options, popUpMenuCommonOptions]
       ],
     menu2 = PopupMenu[Dynamic[opt2],
       {"C", "D"
        }, Sequence[popUpMenu2Options, popUpMenuCommonOptions]
       ]
     },

    Row[{menu1, menu2}]

    ]
   ],

 {{opt1, "A"}, None},
 {{opt2, "D"}, None},
 TrackedSymbols :> {opt1, opt2}
 ]

我不得不删除所有的
文本@
内容,因为这会导致系统中的行显示为空白

这里似乎有两个问题

  • 您可以使用分数
    字段大小
  • 您必须说明下拉箭头的宽度
您可以看到,我可以通过以下方式在最长的线路上获得合理的紧密配合:

Manipulate[opt, 
 Control[{{opt, 0, 
    Style["display", 11]}, {0 -> Style["bob only", Small], 
    4 -> Style["L + bob", Small], 1 -> Style["L only", Small], 
    2 -> Style["L resolved", Small], 
    3 -> Style["L + resolved", Small], 
    5 -> Style["L resolved + bob", Small], 
    6 -> Style["show all above", Small]}, ControlType -> PopupMenu, 
   FieldSize -> 6.4, ImageMargins -> 0, FrameMargins -> 0, 
   ImageSize -> Small}]]


一般来说,我认为Mathematica最好不要将文本压缩到箭头中。我不知道有什么方法可以达到这个效果,如果你想达到这个效果的话。

我想一个愚蠢的解决办法是将所有字符串填充到相同的(最大)长度,然后使用
FieldSize->Automatic

StringPad[str_String,n_Integer] := StringJoin[PadRight[Characters[str], n, " "]]

menuItems = {0->"bob only", 1->"L only",
             2->"L resolved", 3->"L + resolved",
             4->"L + bob", 5->"L resolved + bob",
             6->"show all above"};

maxStr = Max@StringLength@menuItems[[All,2]]

(* Out[3]= 16*)

f[str_String] := StringPad[str, maxStr]

Manipulate[opt,Control[{{opt,0,Style["display",11]},
           MapAt[f,#,2]&/@menuItems,
           ControlType->PopupMenu, FieldSize->maxStr,
           ContentPadding->False, ImageMargins->0,
           FrameMargins->0, ImageSize->Small}]]

这可以在您自己的自定义
弹出菜单中自动执行

根据Simon的答案稍加修改,效果更佳:

Manipulate[opt, 
 Control[{{opt, 0, Style["display", 11]}, 
   {0 -> Style["bob only", Small],
    1 -> Style["L only", Small],  
    4 -> Style["L + bob", Small],
    2 -> Style["L resolved", Small], 
    3 -> Style["L + resolved", Small], 
    5 -> Style["L resolved + bob", Small], 
    6 -> Style["show all above", Small]}, 
 ControlType -> PopupMenu, 
 ImageMargins -> 0, 
 FrameMargins -> 0, 
 ImageSize -> All}]]

只是在寻找其他问题的答案时遇到了这个问题。在可能的情况下,我喜欢将样式与功能分开,因此对于上述示例,我更喜欢只列出一组样式选项,而不是每个标签的样式,例如

Manipulate[opt,
 Style[
  Control[{{opt, 0, "display"}, {0 -> "bob only", 1 -> "L only", 
     4 -> "L + bob", 2 -> "L resolved", 3 -> "L + resolved", 
     5 -> "L resolved + bob", 6 -> "show all above"}, 
    ControlType -> PopupMenu}], 
  DefaultOptions -> {PopupMenu -> {BaseStyle -> 10, ImageMargins -> 0,
       FrameMargins -> 0, ImageSize -> All, MenuStyle -> {Red, 11}}}]]

谢谢我在我的系统(windows 7,Mathematica 8.0.1)上尝试了你的代码,但这个字段仍然是围绕?的?。请参见编辑1。@Nasser我的字体设置可能不同,我的操作系统不同,我的窗口样式也不同。毫不奇怪,它以不同的
字段大小为我包装,而不是为您包装。6.4是在我的特殊情况下没有包装的最小十分之一的值。@MrWizard,是的,我理解。我一直在寻找一个设置或字体风格,它将以同样的方式工作,无论平台。谢谢。@Nasser:Mathematica中许多项的外观都依赖于系统,这很好,否则Mathematica在大多数系统中看起来都不合适。这包括字体、菜单对象、按钮等。。。(评论没有更新……很抱歉重复了W先生的话!)@Nasser,你在问题中没有具体说明。你应该。我不认为你想要什么是可能的,因为我只是无意中演示了,当包装发生时,有些事情超出了你的控制范围。我相信你最好省略
FieldSize
,让Mathematica相应地调整它。如果你使用
FieldSize->Automatic
,那么一切都会自动调整大小。这是一个可接受的解决方案吗?此解决方案不起作用,因为弹出菜单的总体大小将根据所选项目而变化,正如我之前对MrWizad的回答一样。当弹出菜单是较大UI的一部分时,整个UI将稍微移动或调整大小,这很烦人。这就是为什么应该选择fieldsize以适合最大的项目。请参阅编辑2。只是检查!这就是为什么我把它作为一个评论而不是一个答案发布。谢谢你的好主意。我尝试了用空格填充,我也尝试了上面的代码,尝试了上面的不同填充值。但总体菜单大小确实会根据所选项目的不同而变化。如果您一直盯着菜单框,您会注意到它会随着选择不同的项目而改变/调整大小。我也试过使用间隔器[],但不起作用。我发现使用空格强制格式化效果不好。现在,我将坚持使用fieldSize->足够大,并使用额外的空白空间。谢谢。@Nasser:如果您将
字段大小设置为填充字符串大小,它会起作用。(FieldSize以ems为单位测量,因此长度应基本匹配)。我已经编辑了我的答案-它在我的机器上工作。我尝试了你编辑的答案。是的,现在菜单不改变大小。但我发现,如果我在上面的代码中使用“maxstr-5”,它也可以工作。场地实际上更紧了不是吗