Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tkinter,无法从外部调用函数';s级_Python_User Interface_Tkinter - Fatal编程技术网

Python tkinter,无法从外部调用函数';s级

Python tkinter,无法从外部调用函数';s级,python,user-interface,tkinter,Python,User Interface,Tkinter,简单地说,我无法从程序中标记的问题区域调用filterCBOs。它返回: Exception in Tkinter callback Traceback (most recent call last): File "C:\Anaconda\envs\SE_win64_py35\lib\tkinter\__init__.py", line 1550, in __call__ return self.func(*args) File "<ipython-input-24-b9a

简单地说,我无法从程序中标记的问题区域调用filterCBOs。它返回:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Anaconda\envs\SE_win64_py35\lib\tkinter\__init__.py", line 1550, in __call__
    return self.func(*args)
  File "<ipython-input-24-b9ade6a4c197>", line 116, in callFilters
    Root.filterCBOs(self)
  File "<ipython-input-24-b9ade6a4c197>", line 164, in filterCBOs
    startDate = dt.datetime(year=int(self.fromDate.get()[2]),month=int(self.fromDate.get()[0]),day=int(self.fromDate.get()[1]))
AttributeError: 'Event' object has no attribute 'fromDate'
Tkinter回调中出现异常 回溯(最近一次呼叫最后一次): 文件“C:\Anaconda\envs\SE\u win64\u py35\lib\tkinter\\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu.py”,第1550行,在调用中__ 返回self.func(*args) callFilters中第116行的文件“” Root.filterCBOs(自) 文件“”,第164行,在filterCBOs中 startDate=dt.datetime(年=int(self.fromDate.get()[2]),月=int(self.fromDate.get()[0]),日=int(self.fromDate.get()[1])) AttributeError:“事件”对象没有属性“fromDate” 如您所见,当在init中调用该函数时,以及通过选择组合框值调用该函数时,该函数的工作方式与它应该的工作方式完全相同。但是,当通过将enter键绑定到DateEntry中的输入字段来调用它时,它不起作用。我对课程是全新的,所以我确信这与从另一个课程中调用它有关,但我不知道如何在这个问题上导航


    #================================================================================
    # Imports
    #================================================================================
    import os
    import pandas as pd
    import datetime as dt
    import tkinter as tk
    from tkinter import ttk
    startTimestamp=dt.datetime.now()
    print('Starting ' + str(startTimestamp))
    #================================================================================
    # User Changable Variables
    #================================================================================
    #signaturePath = r'T:\Process Data\EDM\Signature Files'
    #================================================================================
    # Functions (mostly used to cleanup variables)
    #================================================================================

    #commented out because i ran this section once and saved to csv. saves me from indexing
    #the directory during testing.   

    '''
    def indexDirectory():
        #filenames use the following format:
        # yyyy.mm.dd.hh.mm.tool.toolSN.feature.sfc.sig
        df = pd.DataFrame(columns=['FullPath', 'Timestamp', 'Feature', 'Machine', 'Tool'])
        for root, dirs, files in os.walk(signaturePath):
            for file in files:
                splitter = file.split('.')
                if len(splitter) != 10: #weird filename
                    continue #skip to next file
                date=dt.datetime.strptime(splitter[0]+'-'+splitter[1]+'-'+splitter[2]+' '+splitter[3]+':'+splitter[4],'%Y-%m-%d %H:%M')
                df = df.append({'FullPath' : os.path.join(root, file), \
                                'Timestamp' : date, \
                                'Feature' : splitter[7], \
                                'Machine' : os.path.basename(root), \
                                'Tool' : splitter[5] + '_' + splitter[6] \
                                }, ignore_index=True)
        return df

    with open(r'C:\Users\u1106710\Desktop\Index.csv', 'w+') as SaTemp:
        indexDirectory().to_csv(SaTemp, header=True, index=False)
    '''


    # Index available signature files to a dataframe
    #sigIndex=indexDirectory
    sigIndex=pd.read_csv(r'D:\Tibbert\4) Scripts\Signature Analysis\Temp\Index.csv')
    sigIndex['Timestamp'] = pd.to_datetime(sigIndex['Timestamp'])
    #================================================================================
    # Build GUI
    #================================================================================
    class DateEntry(tk.Frame):
        def __init__(self, master, frame_look={}, **look):
            args = dict(relief=tk.SUNKEN, border=1)
            args.update(frame_look)
            tk.Frame.__init__(self, master, **args)

            args = {'relief': tk.FLAT}
            args.update(look)

            self.entry_1 = tk.Entry(self, width=2, **args)
            self.label_1 = tk.Label(self, text='/', **args)
            self.entry_2 = tk.Entry(self, width=2, **args)
            self.label_2 = tk.Label(self, text='/', **args)
            self.entry_3 = tk.Entry(self, width=4, **args)

            self.entry_1.pack(side=tk.LEFT)
            self.label_1.pack(side=tk.LEFT)
            self.entry_2.pack(side=tk.LEFT)
            self.label_2.pack(side=tk.LEFT)
            self.entry_3.pack(side=tk.LEFT)

            self.entries = [self.entry_1, self.entry_2, self.entry_3]

            self.entry_1.bind('<KeyRelease>', lambda e: self._check(0, 2))
            self.entry_2.bind('<KeyRelease>', lambda e: self._check(1, 2))
            self.entry_3.bind('<KeyRelease>', lambda e: self._check(2, 4))

            #PROBLEM HERE!
            #self.entry_1.bind('<Return>', Root.filterCBOs)
            #self.entry_2.bind('<Return>', Root.filterCBOs)
            #self.entry_3.bind('<Return>', Root.filterCBOs)

        def _backspace(self, entry):
            cont = entry.get()
            entry.delete(0, tk.END)
            entry.insert(0, cont[:-1])

        def _check(self, index, size):
            entry = self.entries[index]
            next_index = index + 1
            next_entry = self.entries[next_index] if next_index < len(self.entries) else None
            data = entry.get()

            if len(data) > size or not data.isdigit():
                self._backspace(entry)
            if len(data) >= size and next_entry:
                next_entry.focus()

        def get(self):
            return [e.get() for e in self.entries]



    class Root(tk.Tk):
        def __init__(self):
            super(Root, self).__init__()
            self.title("Filmcool Siganture Analysis")
            self.minsize(width=800,height=600)

            self.InitUI()
            self.filterCBOs()

        def InitUI(self):
            #Setup Date Entry
            self.fromDateLBL = tk.Label(self, text='Date Range')
            self.fromDate = DateEntry(self)
            self.toDateLBL = tk.Label(self, text='To')
            self.toDate = DateEntry(self)

            #Set Date Defaults
            self.fromDate.entry_1.insert(0,'01')
            self.fromDate.entry_2.insert(0,'01')
            self.fromDate.entry_3.insert(0,'2014')
            self.toDate.entry_1.insert(0,dt.date.today().month)
            self.toDate.entry_2.insert(0,dt.date.today().day)
            self.toDate.entry_3.insert(0,dt.date.today().year)

            #Setup Feature Combobox
            self.featureLBL = tk.Label(self, text='Feature')
            self.featureCBO = ttk.Combobox(self, width=15)
            self.featureCBO.bind('<<ComboboxSelected>>', self.filterCBOs)

            #Setup Tool Combobox
            self.toolLBL = tk.Label(self, text='Tool')
            self.toolCBO = ttk.Combobox(self, width=15)
            self.toolCBO.bind('<<ComboboxSelected>>', self.filterCBOs)

            #Arrange UI Elements
            self.fromDateLBL.grid(column=0,row=4)
            self.fromDate.grid(column=1,row=4,sticky='e')
            self.toDateLBL.grid(column=2,row=4,sticky='e')
            self.toDate.grid(column=3,row=4)
            self.featureLBL.grid(column=0, row=0, sticky='w')
            self.featureCBO.grid(column=1, row=0)
            self.toolLBL.grid(column=0, row=1, sticky='w')
            self.toolCBO.grid(column=1, row=1)

        def filterCBOs(self, event=None):
            #Create and filter dataframe
            df=sigIndex
            #Filter by Date

    #THROWS ERROR ON NEXT LINE
            startDate = dt.datetime(year=int(self.fromDate.get()[2]),month=int(self.fromDate.get()[0]),day=int(self.fromDate.get()[1]))
            endDate = dt.datetime(year=int(self.toDate.get()[2]),month=int(self.toDate.get()[0]),day=int(self.toDate.get()[1]))
            print(startDate)
            print(endDate)
            df=df[(df['Timestamp'] >= startDate) & (df['Timestamp'] <= endDate)]
            #Filter by Feature
            if self.featureCBO.get() == "":
                pass
            else:
                df=df[df['Feature'] == self.featureCBO.get()]
            #Filter by Tool
            if self.toolCBO.get() == "":
                pass
            else:
                df=df[df['Tool'] == self.toolCBO.get()]

            #print(df)
            #Filter Feature CBO        
            self.featureCBO['values'] = df['Feature'].unique().tolist()
            self.featureCBO['values'] = (*self.featureCBO['values'], '') #add empty line to end
            #Filter Tool CBO 
            self.toolCBO['values'] = df['Tool'].unique().tolist()
            self.toolCBO['values'] = (*self.toolCBO['values'], '') #add empty line to end




    if __name__ == '__main__':
        window = Root()
        window.mainloop()

    print('done')


#================================================================================
#进口
#================================================================================
导入操作系统
作为pd进口熊猫
将日期时间导入为dt
将tkinter作为tk导入
从tkinter导入ttk
startTimestamp=dt.datetime.now()
打印('Starting'+str(startTimestamp))
#================================================================================
#用户可更改变量
#================================================================================
#signaturePath=r'T:\Process Data\EDM\Signature Files'
#================================================================================
#函数(主要用于清理变量)
#================================================================================
#注释掉了,因为我运行了一次此部分并保存到csv。使我免于编制索引
#在测试过程中删除目录。
'''
def indexDirectory():
#文件名使用以下格式:
#yyyy.mm.dd.hh.mm.tool.toolSN.feature.sfc.sig
df=pd.DataFrame(列=['FullPath','Timestamp','Feature','Machine','Tool'])
对于os.walk(signaturePath)中的根目录、目录和文件:
对于文件中的文件:
splitter=file.split('.'))
如果len(拆分器)!=10:#奇怪的文件名
继续#跳到下一个文件
date=dt.datetime.strtime(拆分器[0]+'-'+拆分器[1]+'-'+拆分器[2]+'+拆分器[3]+':'+拆分器[4],“%Y-%m-%d%H:%m”)
df=df.append({'FullPath':os.path.join(根,文件)\
“时间戳”:日期\
“功能”:拆分器[7]\
“计算机”:os.path.basename(根)\
“工具”:拆分器[5]+'.'+拆分器[6]\
},忽略_index=True)
返回df
打开(r'C:\Users\u1106710\Desktop\Index.csv','w+')作为SaTemp:
indexDirectory()。到_csv(SaTemp,header=True,index=False)
'''
#将可用的签名文件索引到数据帧
#sigIndex=indexDirectory
sigIndex=pd.read\u csv(r'D:\Tibbert\4)Scripts\Signature Analysis\Temp\Index.csv')
sigIndex['Timestamp']=pd.to_datetime(sigIndex['Timestamp']))
#================================================================================
#构建GUI
#================================================================================
类日期条目(tk.Frame):
def uuu init uuuu(self,master,frame_look={},**look):
args=dict(浮雕=tk.SUNKEN,边框=1)
args.update(框架外观)
tk.Frame.\uuuuu init\uuuuuu(self,master,**参数)
args={'relief':tk.FLAT}
args.update(外观)
self.entry_1=tk.entry(self,宽度=2,**参数)
self.label_1=tk.label(self,text='/',**args)
self.entry_2=tk.entry(self,宽度=2,**参数)
self.label_2=tk.label(self,text='/',**args)
self.entry_3=tk.entry(self,宽度=4,**参数)
自进式包装(侧面=左侧)
自贴标签_1.包装(侧面=左侧)
自进式包装(侧面=左侧)
自贴标签_2.包装(侧面=左侧)
自进式包装(侧面=左侧)
self.entries=[self.entry_1,self.entry_2,self.entry_3]
self.entry_1.bind('',lambda e:self._check(0,2))
自我输入2绑定(“”,lambda e:自我检查(1,2))
自我输入3.绑定('',lambda e:自我检查(2,4))
#问题在这里!
#self.entry_1.bind(“”,Root.filterbos)
#self.entry_2.bind(“”,Root.filterbos)
#self.entry_3.bind(“”,Root.filterbos)
def_退格(self,entry):
cont=entry.get()
entry.delete(0,tk.END)
条目.插入(0,续[:-1])
def_检查(自身、索引、大小):
条目=自身。条目[索引]
下一个索引=索引+1
下一个索引项=self.entries[下一个索引]如果下一个索引项大小是否为data.isdigit():
self.\u退格(条目)
如果len(数据)>=大小和下一个输入:
下一个项目。焦点()
def get(自我):
在self.entries中为e返回[e.get()]
类根(tk.tk):
定义初始化(自):
超级(根,自我)。\uuuu init\uuuuu()
self.title(“Filmcool符号分析”)
自身最小尺寸(宽度=800,高度=600)
self.InitUI()
self.filterCBOs()
def InitUI(self):
#设置日期条目
self.fromDateLBL=tk.Label(self,text='Date Range')
self.fromDate=DateEntry(self)
self.todatelebl=tk.Label(sel
self.entry_1.bind('<Return>', master.filterCBOs)