【问题标题】:Tkinter executes commands in a different sequence than it says in code?Tkinter 以不同于代码中所说的顺序执行命令?
【发布时间】:2020-03-09 06:10:45
【问题描述】:

为什么程序在 labeler-function 之前执行另一个函数?

from tkinter import *
geni = "generating processes"
...
def labeler(texti):
    activit = Label(graphics,text=texti)
    activit.grid(row=0,column=2)
...
button_1=Button(graphics,text="xy!", command=lambda:[labeler(geni),otherFunction()])
...

【问题讨论】:

  • 这就是关于 UI 编程的事情。没有顺序执行
  • 这更像是为什么lambda:[f1(),f2()] 不按该顺序进行评估
  • 您如何确定labeler() 的执行顺序?它什么都没有具有立即可见的效果,只有当您返回.mainloop()(或显式调用 Tkinter 的更新函数之一)时,才会处理对小部件的更改。
  • 为什么要使用复杂的 lambda 而不是创建合适的函数?如您所见,lambda 很难调试。
  • 请提供正确的minimal reproducible example。简短的回答是“tkinter 总是按照您指定的顺序执行代码”。如果它看起来不是,那是因为您的代码。如果我们看不到重现行为的代码,我们将很难提供帮助。

标签: python python-3.x tkinter


【解决方案1】:

我无法重现您的问题。我用这个作为最小的例子:

from tkinter import *

def fibo(n):
    if n < 1: return 1
    else: return fibo(n-2)+fibo(n-1)

def fun1():
    print("1:", fibo(20))

def fun2():
    print("2:", fibo(19))

root = Tk()
btn = Button(root, text="Test", command=lambda:[fun1(),fun2()])

btn.pack()
root.mainloop()

这会在点击时产生

python tk.py 
1: 17711
2: 10946

【讨论】:

  • AFAIK,fun1()fun2() 都在不同的线程上执行。在您的情况下,由于这两个功能都小而简单,它们确实按顺序执行。如果fun1() 中有计算复杂的代码,我认为会先打印 2。如果我错了,请纠正我
  • 我不知道为什么这两个函数可以在不同的线程上执行。解释器在一个线程上运行,问题确实来自于调用 lambda:[f1(),f2()]() 并且数组是从左到右评估的。
  • docs.python.org/3.8/reference/expressions.html#evaluation-order 了解有关评估订单的更多信息。
  • @learner: “AFAIK,fun1(), fun2() 都在不同的线程上执行。” - 这是错误的。默认的 Tkinter 是单线程的。它们都在主线程中执行。 “我认为会先打印 2。如果我错了,请纠正我” - 你错了。它们将始终按照指定的顺序执行。
  • 感谢您分享@BryanOakley
猜你喜欢
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
相关资源
最近更新 更多