ttk optionmenu小部件从下拉列表中的所有值开始.选择任何值后,列表中的第一个值将消失,永远不会重新出现......
有谁知道为什么?这是小部件设计的一个特征吗?尝试使用以下内容:
import tkinter.ttk as ttk
import tkinter as tk
a = tk.Tk()
options = ['1', '2', '3']
value = tk.StringVar()
masterframe = ttk.Frame()
masterframe.pack()
dropdown = ttk.OptionMenu(masterframe, value, *options)
dropdown.pack()
a.mainloop()
Run Code Online (Sandbox Code Playgroud)
注意 - 另一个用户在此处提出了相同的问题:OptionMenu在点击时不会显示第一个选项(Tkinter)
他们似乎找到了解决方法,但不明白为什么会发生这种情况.
更新:实际上只有在使用ttk小部件时才会出现此行为.tk小部件工作正常(尽管看起来非常难看).
我想使用列表推导来避免编写附加到某些列表的for循环.但它可以使用返回多个值的函数吗?我希望这个(简化示例)代码能够工作......
def calc(i):
a = i * 2
b = i ** 2
return a, b
steps = [1,2,3,4,5]
ay, be = [calc(s) for s in steps]
Run Code Online (Sandbox Code Playgroud)
......但它没有:(
附加到每个列表的for循环有效:
def calc(i):
a = i * 2
b = i ** 2
return a, b
steps = [1,2,3,4,5]
ay, be = [],[]
for s in steps:
a, b = calc(s)
ay.append(a)
be.append(b)
Run Code Online (Sandbox Code Playgroud)
有更好的方法还是我坚持这个?
我认为这应该是一个简单的问题...但是它已经让我困扰了一段时间:(
我希望从指定最大值和增量的输入中创建一个数字列表,该列表以零为中心。所以,
max = 100
increment = 1
Run Code Online (Sandbox Code Playgroud)
会回来
[-100,-99,-98,...,-1,0,1,...,99,100]
Run Code Online (Sandbox Code Playgroud)
和
max = 35
increment = 0.2
Run Code Online (Sandbox Code Playgroud)
会回来
[-35.0,-34.8,...,-0.2,0,0.2,...34.8,35.0]
Run Code Online (Sandbox Code Playgroud)
如果增量没有整齐地划分为最大值,则需要做一个短的最后一步(例如,如果以0.3增量计数到1,它将运行 [-1.0,-0.6,-0.3,0.0,0.3,0.6,0.9,1.0]
list(numpy.linspace()) 似乎是要走的路,但我似乎对如何以最简单的情况以外的任何方式描述的方式进行这项工作有一个完整的思路。
建议表示赞赏!
编辑:我自己的解决方案是
def mylist(stop,step):
a = list(np.arange(0,-stop,-step))+[-stop]
a.reverse()
b = list(a)
c = list(np.arange(0,stop,step))+[stop]
d = b+c
d.remove(0)
e = list(d)
return e
Run Code Online (Sandbox Code Playgroud)
哪怕我也看得出来,这太笨拙了。
最好的答案是:
def mirrored(maxval, inc):
x = np.arange(inc, maxval, inc)
if x[-1] != maxval:
x = np.r_[x, maxval]
return np.r_[-x[::-1], 0, x]
Run Code Online (Sandbox Code Playgroud)
但是我将不得不在Google上多花一点时间来了解为什么它行得通(也不确定我是否要四舍五入……增量的输入可能被合法地指定为多个小数位)