【问题标题】:Statement that force implement the before statement强制执行 before 语句的语句
【发布时间】:2021-09-29 14:17:46
【问题描述】:

是否有任何语句强制在第41行语句之前执行第40行语句。因为我捕获图像后,尽管我在代码中使用root.withdraw(),但我仍然看到图片中的根窗口。我猜第 41 行的语句没有处理,但第 41 行的语句实现了。谁能帮帮我?

def fullscreen():
    root.withdraw() #line 40
    roi_image = ImageGrab.grab(bbox=None) #line 41
    root.deiconify() #line 42
    if roi_image: 
        preview(roi_image)

【问题讨论】:

  • 尝试在第40行和第41行之间添加root.update_idletasks()。如果不起作用,请尝试root.update()
  • 我用了两种方式,但是问题改不了

标签: tkinter root


【解决方案1】:

mainloop 更新它之后,它确实得到了处理,这只有在整个函数完成后才会发生。因此,您可以定义另一个函数在 mainloop 使用 after 处理事件之后调用,以安排稍后(10 毫秒)的事件:

def fullscreen():
    root.withdraw()  #line 40

    def func():
        roi_image = ImageGrab.grab(bbox=None)  #line 41
        root.deiconify()  #line 42
        if roi_image: 
            preview(roi_image)

    root.after(10, func)

使用.update 的较短解决方案:

def fullscreen():
    root.withdraw() #line 40
    root.update()
    roi_image = ImageGrab.grab(bbox=None) #line 41
    root.deiconify() #line 42
    if roi_image: 
        preview(roi_image)

【讨论】:

  • 这与在第 40 行和第 41 行之间添加 root.update() 相同。
  • @TheLizzard 我猜是的,虽然 .update 不是真的建议?,也许 OP 只是错误地使用它
  • 不鼓励这样做,但如果你使用.after 也会出现同样的问题。基本上.update 可以调用用户定义的绑定(而fullscreen 函数仍在运行),这可能会导致问题。如果你在这种情况下使用.after,也会发生同样的事情
  • @TheLizzard 那你会建议什么?可能可以使用线程,但似乎过度
猜你喜欢
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 2020-11-21
  • 2021-04-05
  • 1970-01-01
相关资源
最近更新 更多