【发布时间】:2018-08-05 06:03:00
【问题描述】:
我阅读了很多关于出现NonType 错误的人的帖子,因为他们尝试在定义tk widget 变量的同一行上使用.pack()、.grid() 或.place()。
示例
execute = tk.Button(text="Start", command=lambda:
Elements.ClickApp()).place(x=20, y=250, height=20, width=50)
响应是 A,不能使用 2 个函数,而且 B 无论如何难以在一行中阅读。我开始(不情愿地)接受.pack()、.grid() 或.place() 的附加行,但现在遇到了附加行(甚至不起作用)。如:
T = tk.Entry()
T.bind("<Key>", Elements.Tbox)
T.place(x=20, y=230, height=20, width=50)
这三行不仅不能放在一行,这是我想要的..而且代码甚至不起作用。相反,按下的第一个按钮被忽略,然后第二个按钮(及以后)触发Elements.Tbox。
相反,必须进一步增加换行符:
sv = tk.StringVar()
sv.trace("w", lambda name, index, mode, sv=sv: Elements.Tbox(sv))
T = tk.Entry(textvariable=sv)
T.place(x=20, y=230, height=20, width=50)
然后在第一次按下按钮时正确触发Elements.Tbox。
有没有办法,(可能是lambda)这些新行可以减少? ...在处理大量小部件时,以这种方式对小部件进行分组更容易阅读。我发现这比单独的行更具可读性。
更新
我已经在这个问题的答案中包含了示例代码......尽管标记为正确的答案可能是更好的建议。如果有人需要这样做或类似的事情,您可以执行以下操作:
条目小部件示例:
将EntryBox = tk.Entry() 与.place()、.pack() 或.grid() 结合使用
(lambda g: [(EntryBox.place(x=0, y=0, height=20, width=190)) for g['EntryBox'] in [tk.Entry()]])(globals())
【问题讨论】:
-
您总是可以使用
;在一行中输入多个表达式,就像在 C 中一样,但我怀疑这是一个好方法。 -
不清楚你在问什么。你从问一个问题开始,然后转而问一些不同的问题,最终得到完全不同的问题。请考虑重写您的问题以提出一件事,并使用能够准确重现您的问题的代码。
-
我会考虑重写它...但是很清楚...我想缩短代码的第一个示例...如果不可能,我想缩短第二个代码示例(并让它工作)......如果不可能,我想缩短第三个代码示例。
-
您可以在第三个示例中删除 "T=" 并将 Entry 和 place 放在一行上,因为您可以使用/获取 StringVar 并且不要在其他任何地方使用对 Entry 的引用。如果您有一大组小部件,请使用 for 或函数来创建它们,而不是单独创建它们。
-
为什么在按钮中的命令不起作用时担心代码行数?我没能在你的咆哮中找到一个问题,因此投票决定关闭它。