【问题标题】:Receiving error: _tkinter.TclError: invalid command name ".!frame3.!treeview"接收错误:_tkinter.TclError:无效的命令名称“.!frame3.!treeview”
【发布时间】:2021-05-15 14:54:15
【问题描述】:

我正在为一家本地企业编写一个简单的程序,该程序将允许其用户轻松跟踪他们的工作服务单。在某一时刻,我让程序正常工作。然而,由于我对编程很陌生,并且输入了很多乱七八糟的代码,所以我回去决定清理一些代码,并添加更好的功能。在这样做的过程中,我导致了一个错误发生,我似乎无法修复它。

我尝试了多种方法来解决这个问题,但我所能确定的是,如果我删除一小段代码,它基本上会按应有的方式运行。

这是两个定义:

def gui_elements_remove(self, elements):
     for element in elements:
        element.destroy()

def Load(self):

    self.gui_elements_remove(self.gui_elements) 
    
    var = self.FirstTree.focus()
    treevar = self.FirstTree.item(var)
    JobDF = pd.DataFrame(treevar, index = [0])
    self.JobID = JobDF.iloc[0]['values']

    cursor1 = self.cursor.execute("SELECT * from 'Service Tickets' WHERE JobID = ?", (self.JobID))
    SP = cursor1.fetchall()
    df = pd.DataFrame(SP, columns = [
                                    'ServiceTicketsID',
                                    'JobID',
                                    'Ticket Number',
                                    'Reason for Visit',
                                    'Warranty/VPO',
                                    'Date Ticket Received',
                                    'Date of Service',
                                    'Service Person'
                                    ])
 


    columns =   [
                'ServiceTicketsID',
                'Ticket Number',
                'Reason for Visit',
                'Warranty/VPO',
                'Date Ticket Received',
                'Date of Service',
                'Service Person'
                ]


    LoadFrame = Frame(self.root)
    LoadFrame.pack(fill = BOTH, expand = True, padx = 50)
    scroll = Scrollbar(LoadFrame, orient = VERTICAL)
    SecondTree = ttk.Treeview(LoadFrame, yscrollcommand = scroll.set, columns = columns)
    SecondTree['show'] = 'headings'
    SecondTree.heading('#1', text = 'ServiceTicketsID')
    SecondTree.heading('#2', text = 'Ticket Number')
    SecondTree.heading('#3', text = 'Reason for Visit')
    SecondTree.heading('#4', text = 'Warranty/VPO')
    SecondTree.heading('#5', text = 'Date Ticket Received')
    SecondTree.heading('#6', text = 'Date of Service')
    SecondTree.heading('#7', text = 'Service Person')
    SecondTree.column('#1', width = 0, stretch = NO)
    SecondTree.column('#2', width = 75, stretch = YES, anchor = "n")
    SecondTree.column('#3', width = 75, stretch = YES, anchor = "n")
    SecondTree.column('#4', width = 75, stretch = YES, anchor = "n")
    SecondTree.column('#5', width = 100, stretch = YES, anchor = "n")
    SecondTree.column('#6', width = 100, stretch = YES, anchor = "n")  
    SecondTree.column('#7', stretch = YES, anchor = "n")   
    scroll.config(command = SecondTree.yview)
    scroll.pack(side = RIGHT, fill = Y)
    SecondTree.pack(fill = BOTH, expand = TRUE)
    Maintree = df   [[
                    'ServiceTicketsID',
                    'Ticket Number',
                    'Reason for Visit',
                    'Warranty/VPO',
                    'Date Ticket Received',
                    'Date of Service',
                    'Service Person'
                    ]]
    Maintree_rows = Maintree.to_numpy().tolist()
    for row in Maintree_rows:
        SecondTree.insert("", 0, values = row)

    for col in columns:
        SecondTree.heading(col, text=col, command=lambda _col=col: \
                    self.Treeview_sort_column(SecondTree, _col, False))

    b1 = Button(LoadFrame, text = "Add")
    b2 = Button(LoadFrame, text = "Update")
    b3 = Button(LoadFrame, text = "Cancel")
    b1.configure(command = lambda: self.Load_Add())
    b2.configure(command = lambda: self.Load_Update())
    #b3.configure(command = lambda: self.Cancel_Button(LoadFile, self.MainWindow, self.root))
    b1.pack(side = LEFT, padx = 5, pady = 50)
    b2.pack(side = LEFT, padx = 5, pady = 50)
    b3.pack(side = LEFT, padx = 5, pady = 50)

还有更多代码,但希望我提供的应该绰绰有余。调用第一个方法以清除上一个正在运行的方法中的帧。其余部分应该从先前的 TreeView 中获取用户的选择。但是,在运行此代码时,我得到了错误

_tkinter.TclError: invalid command name ".!frame3.!treeview"

如果我注释掉这段代码:

        var = self.FirstTree.focus()
    treevar = self.FirstTree.item(var)
    JobDF = pd.DataFrame(treevar, index = [0])
    self.JobID = JobDF.iloc[0]['values']

    cursor1 = self.cursor.execute("SELECT * from 'Service Tickets' WHERE JobID = ?", (self.JobID))
    SP = cursor1.fetchall()
    df = pd.DataFrame(SP, columns = [
                                    'ServiceTicketsID',
                                    'JobID',
                                    'Ticket Number',
                                    'Reason for Visit',
                                    'Warranty/VPO',
                                    'Date Ticket Received',
                                    'Date of Service',
                                    'Service Person'
                                    ])
 

以及与之相关的其余代码,程序运行正常。清除框架并引入新的 TreeView 及其标题。

正如我所说,我是编程新手,因此对使用 StackOverflow 也很陌生。话虽如此,如果我没有提供足够的信息、错误地发布等等,我深表歉意。对于您在代码中可能发现的任何草率,我也提前道歉,哈哈。

感谢所有意见。

【问题讨论】:

  • 该错误意味着您创建了多个Tk 实例,或者您正在尝试访问已被破坏的树视图小部件。
  • Bryan,在此代码开头被销毁的小部件之一包含我试图从中获取数据的树视图。我尝试在从上一个表中获取变量之后移动 gui_elements_remove() ,但它不起作用。你有什么建议吗?

标签: python sqlite tkinter


【解决方案1】:
JobDF = pd.DataFrame(treevar, index = [0])

cursor1 = self.cursor.execute("SELECT * from 'Service Tickets' WHERE JobID = ?", (self.JobID))

是罪魁祸首。

应该是的

JobDF = pd.DataFrame(treevar) #removed the index argument

cursor1 = self.cursor.execute("SELECT * from 'Service Tickets' WHERE JobID = ?", (self.JobID,))  #added a comma (self.JobID,))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多