Python tkinter,无法从外部调用函数';s级
简单地说,我无法从程序中标记的问题区域调用filterCBOs。它返回: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
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)