无法调用“事件”命令:应用程序已被破坏

Jak*_*ake 5 python tkinter python-2.7

所以我今天在调试我的一些代码并注意到输出中有一条新消息:

can't invoke "event" command:  application has been destroyed
     while executing
"event generate $w <<ThemeChanged>>"
     (procedure "ttk::ThemeChanged" line 6)
    invoked from within
"ttk::ThemeChanged"
Run Code Online (Sandbox Code Playgroud)

我在 SO 上查看了有关它的问题,但它们与此错误实例无关。至于 ttk 小部件,我没有在我的代码中使用过一次 ttk,在我的代码中搜索字符串“ttk”不会产生任何结果。

输出这个的代码块:

def GoToEvent(self, controller, driver):

    wait = WebDriverWait(driver, 600)

    var = Vars()
    entertain = var.GetVars("Link")
    if type(entertain) == type(""):
        event = var.GetVars("Event")
        entertain = driver.find_element_by_partial_link_text(event)
    entertain.click()
    try:
        # we have to wait for the page to refresh, the last thing that seems to be updated is the title
        wait.until(EC.title_contains("Entertain"))
    finally:
        # the page is ajaxy so the title is originally this:
        msg = driver.title
        label = tk.Label(self, text=msg, cursor='spinning', font="courier 24", bg="#c63f17")
        label.place(x=self.winfo_width()/2, y=self.winfo_height()/2, anchor="center")
        self.update()   # <--- This is where the problem is
        label.destroy()
Run Code Online (Sandbox Code Playgroud)

这似乎实际上并没有引发任何错误,而且我的代码运行得非常好。我无法提供足够的代码来重新定位问题,因为在此之前代码太多了,但是如果有帮助,我可以告诉您我所做的所有测试。我调试了这个代码块,发现在 at 添加断点label.destroy()仍然会出现这个错误,但是在之前的任何地方放置一个并跨步到label.destroy()不会打印这个,这让我相信这是某种类型的计时错误self.update(),但是当我放置time.sleep(5)在之前之后self.update()错误仍然存​​在。所以单步执行代码没有显示错误,但 time.sleep() 仍然显示错误。这让我很困惑,我不知道为什么会这样,我编写这个程序已经 2 周了,这是第一次发生这种情况。如果没有人知道这很好,代码仍然可以完美运行,我只是好奇这意味着什么以及为什么会发生这种情况。谢谢!

代码开头:

# !/usr/bin/python
# coding: utf-8
'''
Created on Jun 23, 2017

@author: jacob    <---------------- Line 6

'''


from selenium import webdriver
#from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0
from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
import os
import platform
import pwd
import re
import time
#import datetime
from time import strftime
import Tkinter as tk     
import tkFont as tkfont  
from Tkinter import Entry, Menu, Menubutton, Canvas
Run Code Online (Sandbox Code Playgroud)

Jak*_*ake 5

所以这是一个很难发现的错误,因为调试从未指向正确的代码区域,我必须通读代码才能尝试找到问题。因此,程序获取用户输入的关键字,然后在网站上搜索包含该关键字的事件,然后将它们放入下拉菜单中。如果该关键字仅出现一次或没有出现,则不会显示菜单,它会单击该事件或提示用户提供最接近其关键字的建议事件。这似乎是发生此错误的可能区域,因为它仅在没有显示菜单时发生。代码来自于此:

    if (len(options) > 1):

        button6 = tk.Button(selectMenu, text="Enter",
                        cursor='pointinghand', command=lambda: self.GetSelection(str(var.GetVars("Selection")), links, options, selectMenu, controller))  

        msg = "Which one would you like to attend?"
        label = tk.Label(selectMenu, text=msg, font="Helvedica 14")
        label.pack(side='top', pady=10)
        menbutton.pack(side="top", pady=10)        
        button6.pack(pady=10)

        self.Progress()

        selectMenu.attributes('-topmost', True)
        selectMenu.mainloop()
    elif options:
        var.SendVars("selLink", links[0])
        selectMenu.destroy()
        self.Progress()
    else:
        var.SendVars("Link", 'NO-LINK-FOUND')
        selectMenu.destroy()
        self.Progress()
Run Code Online (Sandbox Code Playgroud)

事实证明,这个错误是由在 tk 窗口中创建的 Menubutton 引起的,但从未到达主循环,即使它已被销毁。当到达另一个 tk 窗口的主循环时,会抛出该错误。因此,要解决此问题,您可以将菜单按钮的创建移动到它将到达其主循环的位置,如下所示。

在此输入图像描述

  • 由于您的回答很好,我在 Tk 小部件上调用 destroy() 之前添加了 update() 调用,以消除我自己的代码中的错误消息。 (5认同)